如何将表单传递给模板而不将其传递给Django中的视图?

时间:2015-11-16 10:53:42

标签: django django-forms django-templates django-views

目前我向用户展示了一些Posts。处理此页面的GenericViewDetailView,我已将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>

这是正确的做法吗?如果是这样,我该如何解决?

1 个答案:

答案 0 :(得分:1)

没有。 ID是提交的表单数据的一部分,它不是URL的一部分,也不需要成为视图的参数。