如何设置与答案关联的问题?

2024-06-16 11:10:46 发布

您现在位置:Python中文网/ 问答频道 /正文

我想问一问;一个用于实践的网站,我希望每个答案都与一个作者和一个问题相关联,我设法将其与用户关联,但我无法找出问题的部分

代码如下:

models.py:

class Questiont(models.Model):
    question = models.CharField(max_length=200)
    description = models.TextField(null = True , blank=True)
    date_posted =models.DateTimeField(default=timezone.now)
    author = models.ForeignKey(User,on_delete=models.CASCADE)

    def __str__(self):
        return self.question

class Answer(models.Model):
    content = models.TextField(null=True,blank=True)
    question = models.ForeignKey(Question, on_delete=models.CASCADE)
    author = models.ForeignKey(User,on_delete=models.CASCADE)
    date_posted = models.DateTimeField(default=timezone.now)

views.py(关联发生的位置):

class CreateAnswer(LoginRequiredMixin,CreateView):
    model = Answer
    fields = ['content']
    context_object_name = 'answer'
    success_url = reverse_lazy('Lisk home')


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

如何指定答案指定的问题(form.instance.question)?假定正在回答的问题的ID位于回答页面(模板)的URL中

url如下所示:

http://127.0.0.1:8000/question/22/createanswer/

url.py(不是根):

politicspost=questioon (sorry if this is messy)

 path('politics_topic/', views.Politics_topic.as_view(template_name='lisk_templates/politics_topic_template.html'),
         name='Politics_topic'),
    path('ask_politics/', views.Questionpolitics.as_view(template_name='lisk_templates/ask_politics_template.html'),
         name='ask_politics'),
    path('politicspost/<int:pk>/',views.Politics_post_details.as_view(template_name='lisk_templates/politics_post_details.html'),
         name='politics_post_details'),
    path('politicspost/<int:pk>/update/',views.Updatepolitics.as_view(template_name='lisk_templates/ask_politics_template.html'),
         name='updatepoliticspost'),
    path('politicspost/<int:pk>/delete/',views.Deletepoliticspost.as_view(template_name='lisk_templates/delete_politics_confirmation.html'),name ='deletepoliticspost'),

    #ANSWER
    path('politicspost/<int:id>/createanswer/',views.CreateAnswer.as_view(template_name='lisk_templates/createanswer.html'),name = 'createanswer'),
    path('answers/',views.Answerslist.as_view(template_name='lisk_templates/politics_post_details.html'),name ='answers')

提前谢谢


Tags: pathnameformviewmodelshtmlastemplate
2条回答

鉴于您已经在使用基于类的视图,我建议使用内置的UpdateView。这样,您就不必进行额外的处理,因为您需要在URL中输入问题的主键(答案将成为URL的一部分),Django将获取相应的问题本身

虽然,对我来说,你的观点名称是误导性的。是的,您正在创建一个答案,但是您也在更新父问题对象,我相信这会导致您选择Createview而不是Updateview-第二个答案更有利

基本上,您将添加一个答案,但在问题对象下处理它更方便

当您在一个视图/url路径中处理多个对象时,使用描述性名称总是很方便的:使用question_id而不是id,这样它就不同于answer_id,您以后可能需要它:/politics_post/<int:question_id>/answers/<int:answer_id>/change/

这些名字只是标签。它们保存在CreateView的kwargs属性中。因此/politics_post/42/answers/59/change将创建: CreateView.kwargs = {'question_id': 42, 'answer_id': 59}。更多信息请参见the docs

正如@crimsonpython24所说,您可以从问题的角度来做这件事,但使用答案作为您的模型也同样好。现在,我假设您将url更改为具有问题id。您将更改您的创建视图,如下所示:

class CreateAnswer(LoginRequiredMixin,CreateView):
    model = Answer
    fields = ['content']
    context_object_name = 'answer'
    success_url = reverse_lazy('Lisk home')
    question_kwarg = 'question_id'


    def form_valid(self, form):
        try:
            question = Question.objects.get(pk=self.kwargs[self.question_kwarg])
        except Question.DoesNotExist:
            form.add_error(None, 'Invalid question')
            return self.form_invalid(form)
        form.instance.question = question
        form.instance.author = self.request.user
        return super().form_valid(form)

相关问题 更多 >