Django DeleteView без слагов и через POST - PullRequest
0 голосов
/ 18 декабря 2018

Здравствуйте! Я хочу удалить объект в модели, но не хочу показывать идентификатор в слаге, поэтому я понял, что могу отправить данные через скрытый тег в форме, но мне не удалосьзаставить его работать

Шаблон

<form action="{% url "delete_url" %}" method="post">
    {% csrf_token %}
    <input type="hidden" name="pk" value={{ model.pk }}>
    <button type="submit">Delete</button>
</form>

URL.Проверьте, я не хочу слизняк

path("delete_view", views.MyDeleteView.as_view(), name="delete_url")

Просмотр

class MyDeleteView(DeleteView):
    model=ModelName
    success_url = reverse_lazy("success_url")

Ответы [ 2 ]

0 голосов
/ 18 декабря 2018

Благодаря Serafeim я могу найти способ сделать это, я должен заменить метод get_object () и скопировать некоторый код из оригинального метода.Я получаю код по ссылке: https://ccbv.co.uk/projects/Django/2.0/django.views.generic.edit/DeleteView/

Окончательно:

class MyDeleteView(DeleteView):
    model=ModelName
    success_url = reverse_lazy("success_url")

def get_object(self, queryset=None):
    pk = self.request.POST['pk']
    if queryset is None:
        queryset = self.get_queryset()
    if pk is not None:
        queryset = queryset.filter(pk=pk)
    try:
        # Get the single item from the filtered queryset
        obj = queryset.get()
    except queryset.model.DoesNotExist:
        raise Http404("No %(verbose_name)s found matching the query" %
                      {'verbose_name': queryset.model._meta.verbose_name})

    return obj
0 голосов
/ 18 декабря 2018

Прежде всего, ваш пример кода имеет различные проблемы, которые необходимо исправить:

  1. Тип ввода должен быть hidden, а не hiden.
  2. Ваш классимя на основе представления должно иметь правильную прописную букву: MyDeleteView, а не delete_view

Теперь, для вашей актуальной проблемы: DeleteView использует SingleObjectMixin для идентификации объекта (проверьте это https://ccbv.co.uk/projects/Django/2.0/django.views.generic.edit/DeleteView/). Таким образом, вам необходимо переопределить метод get_object для SingleObjectMixin, чтобы использовать данные POST вместо слага для извлечения объекта. Возможно, что-то подобное должно работать (предупреждение, что обработка ошибок не выполняется):

  class MyDeleteView(DeleteView):
    model=ModelName
    success_url = reverse_lazy("success_url")

    def get_object(self, queryset=None):
      pk = self.request.POST['pk']
      return self.get_queryset().filter(pk=pk).get()

Для более лёгкого знакомства с CBV я рекомендую руководство по CBV: https://spapas.github.io/2018/03/19/comprehensive-django-cbv-guide/

...