#python #django
#питон #джанго
Вопрос:
Здравствуйте, я составляю список дел django, и у меня есть вопрос. Могу ли я удалять и создавать элементы в одном представлении? Лично я бы не стал использовать CreateView для этого и делать это, как в «def post», и игнорировать «get_success_url», но это хорошая и диангоническая практика? 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
lt;div class="card__items-list"gt; {% for item in items %} lt;div class="card__item-row"gt; lt;p class="card__item"gt;{{ item.name }}lt;/pgt; lt;form action="{% url 'home-page' %}" class="card__delete" method="POST"gt; {% csrf_token %} lt;button class="card__delete__button" name="delete" type="submit"gt;amp;#10008lt;/buttongt; lt;/formgt; lt;/divgt; {% endfor %} lt;/divgt; lt;form name="add" method="POST"gt; {% csrf_token %} {{ form }} lt;button name="add" class="submit-button" type="submit"gt;Submitlt;/buttongt; lt;/formgt; lt;/divgt;
Ответ №1:
Можно обрабатывать как удаление, так и создание объектов в одной функции представления Django. Тем не менее, возможно, лучше обрабатывать эти операции в отдельных командах действий HTTP (POST vs DELETE).
Например, ваше Home
представление может обрабатывать обе эти операции, но разделять их на разные if
блоки на основе глагола HTTP-действия запроса. Затем с вашей веб-страницы операция создания отправит запрос HTTP POST, а операция удаления отправит запрос HTTP НА УДАЛЕНИЕ.
Это можно сделать в одной функции просмотра Django, используя следующий пример кода:
def my_sample_view(request): if request.method == "POST": # Handle create logic here. elif request.method == "DELETE": # Handle delete logic here.
Ответ №2:
Да, вы можете это сделать.
Лично я бы FormView
не стал использовать CreateView
, а сделал бы постобработку в form_valid
методе. Это противоречит ожиданиям, что a CreateView
что-то удалит, в то время как обработка формы в принципе может сделать все, что угодно.