Как получить идентификатор объекта в form_valid? - PullRequest
2 голосов
/ 03 ноября 2019

Я пытаюсь создать форму комментария в приложении для публикации сообщений с django, проблема в том, что я не могу получить его собственный идентификатор объекта, любая идея?

#views.py
class MyFormView(FormView):
    form_class = CommentForm
    success_url = "/"

    def form_valid(self,form,*args,**kwargs):
        comment = form.save(commit=False)
        comment.message=Message.objects.get(id=???)
        comment.save()
        return super(MyFormView, self).form_valid(form)
#urls.py
urlpatterns = [
    path('', MessageListView.as_view(),name="messaging-main"),
    path('new', MessageCreateView.as_view(),name="messaging-new"),
    path('post/<int:pk>', MessageDetailView.as_view(),name="messaging-detail"),
    path('my_form',MyFormView.as_view(),name="form-view")
]
#forms.py
class CommentForm(forms.ModelForm):
    class Meta:
        model = Comment
        fields = ['comment']
#models.py
class Message(models.Model):
    date_posted = models.DateTimeField(default=timezone.now)
    message = models.TextField()
    image = models.ImageField(default="")


    def __str__(self):
        return self.message

class Comment(models.Model):
    message = models.ForeignKey(Message,on_delete=models.CASCADE)
    comment = models.TextField(max_length=50)
    date_posted = models.DateTimeField(default=timezone.now)

    def __str__(self):
        return "Comment on {}".format(str(self.date_posted))

    def get_absolute_url(self):
        return reverse("messaging-detail",kwargs={"id":self.id})

Если бы я должен был заменить ??? например, 7, он будет публиковать каждый комментарий к сообщению (или сообщению) с идентификатором 7, но я хочу, чтобы комментарий был опубликован в сообщении, которое я вижу. Любая помощь приветствуется

1 Ответ

1 голос
/ 03 ноября 2019

Вам нужно будет закодировать первичный ключ (или другой атрибут) сообщения в запросе. Это можно сделать несколькими способами: например, кодировав его в URL-адресе, который активируется, или скрытым полем в форме, которое затем будет отправлено в качестве параметра POST.

Таким образом, например, мы можем добавитьпараметр message_id для URL:

#urls.py

urlpatterns = [
    # &hellip;,
    path('my_form/<b><int:message_pk></b>', MyFormView.as_view(), name="form-view")
]

Затем в форме мы можем использовать параметр, получив к нему доступ в self.kwargs:

#views.py

class MyFormView(FormView):
    form_class = CommentForm
    success_url = "/"

    def form_valid(self,form,*args,**kwargs):
        form.instance.<b>message_id = self.kwargs['message_pk']</b>
        self.object = form.save()
        return super(MyFormView, self).form_valid(form)

Используя message_id, мы избегаем дополнительного вызова базы данных для извлечения соответствующего Message.

В шаблоне, который вы отображаете для представления MessageDetailView, <form> необходимо будет использовать в качестве URL-адреса действия. URL с соответствующим первичным ключом сообщения. Например, если имя объекта контекста 'message', вы можете передать его с помощью:

<form action="<b>{% url 'form-view' message_pk=message.pk %}</b>" method="post">
    &hellip;
</form>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...