我想问一问;一个用于实践的网站,我希望每个答案都与一个作者和一个问题相关联,我设法将其与用户关联,但我无法找出问题的部分
代码如下:
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')
提前谢谢
鉴于您已经在使用基于类的视图,我建议使用内置的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。您将更改您的创建视图,如下所示:
相关问题 更多 >
编程相关推荐