我正在建立一个用于练习的问答网站,我希望每个答案都与一个作者和一个问题相关联,我设法将其与用户相关联,但是我无法弄清问题部分。
这是代码:
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中。
网址是这样的:
http://127.0.0.1:8000/question/22/createanswer/
urls.py(不是root):
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')
提前致谢。
当您在一个视图/ URL路径中处理多个对象时,使用描述性名称总是很方便的:使用question_id
not id
,这样它就不同于answer_id
,稍后可能需要使用/politics_post/<int:question_id>/answers/<int:answer_id>/change/
,例如。
这些名称只是标签。它们保存在kwargs
CreateView的属性中。因此/politics_post/42/answers/59/change
将创建:CreateView.kwargs = {'question_id': 42, 'answer_id': 59}
。在文档中有更多信息。
正如@ crimsonpython24所说,您可以从问题的角度进行操作,但是使用Answer作为模型也可以。现在,我将假设您将URL更改为具有question_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)
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句