目前我向用户展示了一些Posts
。处理此页面的GenericView
是DetailView
,我已将FormMixin
传递到其中以处理Comment
功能。
现在我想在每个帖子的底部添加一个Flag或Report表单。我发现了一些方法可以将两种不同的形式传递给一个通用视图,但我发现它们很混乱,django建议不要做这么复杂的事情。我的问题是我该如何完成这项任务?
实际上我试图手动渲染表单,但我无法弄清楚如何将原因ID传递给表单的操作。
报告模型:
class Report(models.Model):
reporter = models.ForeignKey(User, related_name='reporters')
content_type = models.ForeignKey(ContentType)
object_id = models.PositiveIntegerField()
object = GenericForeignKey('content_type', 'object_id')
reason = models.IntegerField(choices=REASON_CHOICES, default=BROKEN_LINK)
报告表格:
BROKEN_LINK, RUDE, BAD_TRANSLATE, IRR = range(4)
REASON_CHOICES = (
(BROKEN_LINK, 'Broken_link'),
(RUDE, 'Rude'),
(BAD_TRANSLATE, 'Bad_translate'),
(IRR, 'Irr')
)
class ReportForm(forms.ModelForm):
class Meta:
model = Report
fields = ['reason']
widgets = {
'reason': forms.RadioSelect,
}
报告views.py: (report_object和ReportCreateView正在做同样的工作,第一个是我决定不使用通用视图创建处理表单的时间)
def report_object(request, model, object_id, reason):
if request.post == POST:
...
class ReportCreateView(CreateView):
model = Report
form_class = ReportForm
template_name = "forms/report_form.html"
def form_valid(self, form):
...
在textdeatilview
中,我将原因定义为:
context['reasons'] = REASON_CHOICES
这是我在模板中想要做的事情:
<form class="report" method="POST" id="{{ post.id }}" action="{% url 'report_create' model="post" object_id=post.id reason=??? %}">
{% csrf_token %}
{% for id, value in reasons %}
<p><input type="radio" name="reason" id="" value="{{ id }}" />{{ value }}</p>
{% endfor %}
<input type="submit" value="Add">
</form>
这是正确的做法吗?如果是这样,我该如何解决?
答案 0 :(得分:1)
没有。 ID是提交的表单数据的一部分,它不是URL的一部分,也不需要成为视图的参数。