У объекта 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.
Просто добавьте кнопку редактирования на вашу страницу деталей, которая является обратной к виду формы :)
Если вам нужна дополнительная помощь, просто напишите комментарий.