У объекта Django 'x' нет атрибута 'get_form'

У меня есть общий DetailView, и я пытаюсь сделать форму для комментария пользователя после отображения деталей модели, но я продолжаю получать ошибку 'ProductFeedbackView' object has no attribute 'get_form'.

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

Вот модель комментария:

class Comment(models.Model):
    service = models.ForeignKey(Product, on_delete=models.CASCADE, blank=True, null=True, related_name='comments')
    author = models.ForeignKey(User, on_delete=models.CASCADE, blank=True, null=True,)

    content = models.CharField(max_length=200, null=False, blank=True)
    ...

    def get_absolute_url(self):
        return reverse('product-feedback', kwargs={'pk': self.pk})

Форма комментария:

class CommentForm(forms.ModelForm):
    content = forms.CharField()

    class Meta:
        model = Comment
        fields = ['content']

Вид:

class ProductFeedbackView(DetailView):
    model = Product
    template_name = 'services/product-feedback.html'
    form_class = CommentForm

    def get_success_url(self):
        return reverse('product-feedback', kwargs={'pk': self.object.id})

    def get_context_data(self, **kwargs):
        context = super().get_context_data(**kwargs)
        context['form'] = CommentForm(initial={'content': self.object})
        return context

    def post(self, request, *args, **kwargs):
        self.object = self.get_object()
        form = self.get_form()
        if form.is_valid():
            return self.form_valid(form)
        else:
            return self.form_invalid(form)

    def form_valid(self, form):
        form.instance.author = self.request.user
        form.save()
        return super().form_valid(form)

urls's:

    ...
    path('feedback/<int:pk>/', ProductFeedbackView.as_view(), name='product-feedback'),

Шаблон:

<a href="{% url 'product-detail' product.id %}">Details</a>
<a href="{% url 'product-feedback' product.id %}">Feedback</a>

<p>{{ product.author }}</p>
<h1>{{ product.title }}</h1>
<p>{{ product.description }}</p>

{% if user.is_authenticated %}
    <form method="POST">
        <label for="comment">Type comment</label>
        {{ form.as_p }} {% csrf_token %} <input type="submit" value="Post">
    </form>
{% else %}
    ...
{% endif %}

{% for comment in comment.service.all %}
     <p>{{ comment.author }}</p>
     <p>{{ comment.content }}</p>
{% endfor %}

Вам необходимо наследовать смешивание представления формы следующим образом:

from django.views.generic.edit import FormMixin

class ProductFeedbackView(DetailView, FormMixin):
    ...

Согласно руководству django classy based views:

https://ccbv.co.uk/projects/Django/4.1/django.views.generic.edit/FormView/

Однако, смешивание детального представления и представления редактирования, вероятно, не соответствует обычной методологии djagno-esque.

Скорее всего, вам лучше иметь детальное представление и представление редактирования (FormView) соответственно и использовать встроенное поведение django.

Просто добавьте кнопку редактирования на вашу страницу деталей, которая является обратной к виду формы :)

Если вам нужна дополнительная помощь, просто напишите комментарий.

Вернуться на верх