Удаление и создание в CreateView django
Здравствуйте, я делаю список дел на django и у меня есть вопрос. Могу ли я удалять и создавать элементы в одном представлении? Лично я бы не использовал CreateView для этого, а сделал бы как в 'def post' и игнорировал 'get_success_url', но является ли это хорошей и djangonic практикой? views.py
class Home(CreateView):
model = Item
template_name = 'home/todo.html'
form_class = itemCreationForm
def get_context_data(self, **kwargs):
context = super().get_context_data(**kwargs)
context['items'] = Item.objects.all()
return context
def get_success_url(self):
return reverse('home-page')
def post(self, request):
form = itemCreationForm()
if 'delete' in self.request.POST:
print('deleted')
return redirect('home-page')
if 'add' in self.request.POST and form.is_valid():
form.save()
return HttpResponse('home-page')
HTML
<div class="card__items-list">
{% for item in items %}
<div class="card__item-row">
<p class="card__item">{{ item.name }}</p>
<form action="{% url 'home-page' %}" class="card__delete" method="POST"> {% csrf_token %}
<button class="card__delete__button" name="delete" type="submit">✘</button>
</form>
</div>
{% endfor %}
</div>
<form name="add" method="POST"> {% csrf_token %}
{{ form }}
<button name="add" class="submit-button" type="submit">Submit</button>
</form>
</div>
Можно обрабатывать удаление и создание объектов в одной функции представления Django. Однако, возможно, лучшей практикой является обработка этих операций в отдельных глаголах действия HTTP (POST vs DELETE).
Например, ваше представление Home
может обрабатывать обе эти операции, но разделять их на разные if
блоки на основе HTTP-глагола действия запроса. Тогда с вашей веб-страницы операция создания будет отправлять HTTP POST запрос, а операция удаления - HTTP DELETE запрос.
Это можно сделать в одной функции представления Django, используя следующий пример кода:
def my_sample_view(request):
if request.method == "POST":
# Handle create logic here.
elif request.method == "DELETE":
# Handle delete logic here.
Да, вы можете это сделать.
Лично я бы использовал FormView
, а не CreateView
, и сделал бы обработку POST в методе form_valid
. Это противоречит ожиданиям, что CreateView
будет что-то удалять, тогда как обработка формы может делать все, что угодно.