【问题标题】:2 Forms in a django template using cookiecutter-django2 使用 cookiecutter-django 的 django 模板中的表单
【发布时间】:2019-11-11 09:11:50
【问题描述】:

我正在 cookiecutter-django 中的一个模板上创建 2 个表单。我有两个表单都在正常的 django 项目上工作,但是当我将它们迁移到 cookiecutter-django 时,这些表单在 user_detail 模板上不起作用。

这是forms.py

class NarrateForm(ModelForm):
    class Meta:
        model = Narrate
        fields = [
            'title',
            'body',
        ]
        exclude = ('status',)


class TranslateForm(ModelForm):
    class Meta:
        model = Translate
        fields = [
            'title',
            'body',
        ]
        exclude = ('status',)

这些是我拥有的表单的views.py:

class TranslateFormView(FormView):
    form_class = TranslateForm
    template_name = 'user_detail.html'

    def post(self, request, *args, **kwargs):
        add_translation = self.form_class(request.POST)
        add_narration = NarrateForm()
        if add_translation.is_valid():
            add_translation.save()
            return self.render_to_response(
                self.get_context_data(
                    success=True
                )
            )
        else:
            return self.render_to_response(
                self.get_context_data(
                    add_translation=add_translation,
                )
            )

class NarrateFormView(FormView):
    form_class = NarrateForm
    template_name = 'users/user_detail.html'

    def post(self, request, *args, **kwargs):
        add_narration = self.form_class(request.POST)
        add_translation = TranslateForm()
        if add_narration.is_valid():
            add_narration.save()
            return self.render_to_response(
                self.get_context_data(
                    success=True
                )
            )
        else:
            return self.render_to_response(
                self.get_context_data(
                    add_narration=add_narration,
                )
            )

现在这是来自 cookiecutter-django 的 user_details 视图

class UserDetailView(LoginRequiredMixin, DetailView):

    model = User
    slug_field = "username"
    slug_url_kwarg = "username"


user_detail_view = UserDetailView.as_view()

这是适用于旧 django 项目的模板上的代码

<form method="POST" action="#">
    {% csrf_token %}
    {{ add_narration }}
    <button type="submit" name="submit" value="Send Narration">Submit Narration</button>
</form>

<form method="POST" action="#">
    {% csrf_token %}
    {{ add_translation }}
    <button type="submit" name="submit" value="Send Narration">Submit Narration</button>
</form>

我已经尝试完成这项工作超过 2 小时,但没有运气。

【问题讨论】:

    标签: django django-forms django-views cookiecutter-django


    【解决方案1】:

    一种可能的解决方案是在 forms.py 文件中创建一个基本表单(扩展 django.forms.Form),稍后在 views.py 文件中手动创建字段和模型。

    【讨论】:

    • 嗯,我明白了。我可以在 UserDetailView 中包含这两个表单,因为这是我想要这两个表单的视图吗?
    • 是的,您可以在 UserDetailViee.get_context_data() 中初始化它们,然后使用
      在一个
      中输出它们
    【解决方案2】:

    为提交输入指定不同的名称,如下所示

    <form method="POST" action="#">
        {% csrf_token %}
        {{ add_narration }}
        <button type="submit" name="narrationsubmit" value="Send Narration">Submit Narration</button>
    </form>
    
    <form method="POST" action="#">
        {% csrf_token %}
        {{ add_translation }}
        <button type="submit" name="transaltionsubmit" value="Send Narration">Submit Narration</button>
    </form>
    

    然后在您的视图中按如下方式处理它们。

    def handleforms(request):
        if request.method =="POST" and "narrationsubmit" in request.post:
            //process
        elif request.method =="POST" and "transaltionsubmit" in request.post:
            //process
    

    注意:这是针对基于函数的视图。将其格式化为 CBV

    【讨论】:

      猜你喜欢
      • 2016-09-10
      • 1970-01-01
      • 2017-06-26
      • 1970-01-01
      • 1970-01-01
      • 2015-06-13
      • 2020-03-12
      • 2015-11-28
      • 2015-08-19
      相关资源
      最近更新 更多