Джанго: Могу ли я использовать CreateView и DeleteView в одной и той же форме?

Я хочу показать две кнопки в одной форме, первую кнопку я хочу использовать для удаления объекта, а вторую кнопку для создания объекта.

Например, я хочу создать простую модель, например:

models.py:

class UrlStatus_Proxy(models.Model):

    urls = models.URLField(u'Site URL', max_length=100, null=True, unique=True)
    status_url = models.CharField(u'Site', max_length=20, choices=STATUS_URL)

urls.py

url(r'^url_status/$',ProxyUrlCreateView.as_view(model=UrlStatus_Proxy,
     get_success_url=lambda: reverse('proxy_url_status'),template_name='proxy_url_status.html'), name='proxy_url_status'),

proxy_url_status.html

<form action="" method="post">    
    {{form.as_p}}
    <input type="submit" name="delete" id="delete">
    <input type="submit" name="add" id="add">
</form>

Если у меня нет объектов в базе данных, ничего не делайте, просто отобразите форму из модели, и у вас есть только одна возможность добавить новый объект в базу данных.

Если у меня есть объекты в базе данных, то перечислите объект, например таблицу, а в таблице у меня есть одно поле флажка. Когда я проверил один из объектов и нажал кнопку «Удалить», я хочу удалить этот объект.

Во втором случае, если я заполняю поле ввода из объекта и нажимаю кнопку "добавить", я хочу добавить объект в базу.

Как мне это сделать?


person prog.Dusan    schedule 27.02.2013    source источник


Ответы (1)


Сначала добавьте все существующие объекты в контекст CreateView и обновите шаблон HTML, чтобы отобразить их в виде таблицы над формой. Затем создайте DeleteView и сопоставьте с ним URL-адрес.

URL-адреса

url(r"^url_status/$",
    ProxyUrlCreateView.as_view(),
    name="proxy_url_status"),

url(r"^url_status/(?P<pk>\d+)/delete/?$",
    DeleteProxyURLView.as_view(),
    name="delete_proxy"),

Взгляды

from django.views.generic import DeleteView
from django.core.urlresolvers import reverse

# add existing objects to the context, making them available to the template
class ProxyUrlCreateView(CreateView):
    model = UrlStatus_Proxy
    template_name = "proxy_url_status.html"

    def get_success_url(self):
        return reverse("proxy_url_status")

    def get_context_data(self, **kwargs):
        kwargs["object_list"] = UrlStatus_Proxy.objects.all()
        return super(ProxyUrlCreateView, self).get_context_data(**kwargs)

class DeleteProxyURLView(DeleteView):
    model = UrlStatus_Proxy

    def get_success_url(self):
        """
        Redirect to the page listing all of the proxy urls
        """
        return reverse("proxy_url_status")

    def get(self, *args, **kwargs):
        """
        This has been overriden because by default
        DeleteView doesn't work with GET requests
        """
        return self.delete(*args, **kwargs)

Шаблон

<table>
    {% for proxy_url in object_list %}
    <tr>
        <td>{{ proxy_url.urls }}</td>
        <td><a href="{% url delete_proxy %}">Delete</a></td>
    </tr>
    {% endfor %}
</table>

<form action="" method="post">    
    {{form.as_p}}
    <input type="submit" name="add" id="add">
</form>
person Matt Deacalion    schedule 27.02.2013
comment
Хм... Можете ли вы написать мне немного кода, потому что я новый программист django, и я не могу точно понять, что вы мне написали. - person prog.Dusan; 28.02.2013
comment
в порядке. Я сделал, и теперь, как я могу создать/удалить объект в зависимости от того, какую кнопку я нажал? - person prog.Dusan; 28.02.2013
comment
Ах хорошо, я неправильно понял вопрос. Код, который я предоставил выше, отобразит таблицу существующих объектов со ссылкой «удалить» рядом с каждым из них. - person Matt Deacalion; 28.02.2013
comment
Если вы все еще используете кнопку удаления флажка, я предлагаю либо выполнить эту клиентскую часть с помощью Javascript (с представлением для обработки удаления нескольких объектов), либо изучить наборы моделей в сочетании с дополнительные представления. - person Matt Deacalion; 28.02.2013
comment
Да, у меня есть функция jquery для проверки всех флажков, но я не знаю, как в этом случае реализовать кнопку отправки. ;) - person prog.Dusan; 28.02.2013