Django 基于类的视图:覆盖表单名称

Posted

技术标签:

【中文标题】Django 基于类的视图:覆盖表单名称【英文标题】:Django Class Based Views : Override form name 【发布时间】:2016-02-02 19:40:13 【问题描述】:

我是 Django 的新手。我尝试构建基于类的视图以创建对象。

模板中表单的默认名称是form,我想将其更改为"ajoutersource",但我不知道如何。

views.py

class ajoutSource(CreateView):
    model = Source
    template_name = "pmd/ajouterSource.html"
    form_class = AjouterSourceForm
    success_url = reverse_lazy(ListerSources)

ajouterSource.html

% for field in ajoutersource % 
    <div class="row"> 
        % if field.errors %
            <div class="error"> field.errors </div> 
        % endif %
        <div class="label"> field.label </div> 
        <div class="field"> field </div>
    </div> 
% endfor %

【问题讨论】:

【参考方案1】:

覆盖get_context_data():

class ajoutSource(CreateView):
    model = Source
    template_name = "pmd/ajouterSource.html"
    form_class = AjouterSourceForm
    success_url = reverse_lazy(ListerSources)

    def get_context_data(self, **kwargs):
        context = super(ajoutSource, self).get_context_data(**kwargs)
        context["ajoutersource"]=context["form"]
        return context

【讨论】:

【参考方案2】:

你可以通过以下方法简单地做到这一点

方法一(模型形式)

def get_context_data(self, **kwargs):
    context = super().get_context_data(**kwargs)
    context['new_name'] = self.get_form()
    return context

方法二(简单形式)

def get_context_data(self, **kwargs):
    context = super().get_context_data(**kwargs)
    context['new_name'] = context["form"]
    return context

推荐方法1 (注意:这是 python 3.6+ 的语法,将 super() 调用改为 python 2.0+)

【讨论】:

【参考方案3】:

覆盖get_context_datacontext['form']取自SomeForm,改成form_1,你可以在模板中使用form_1

class Something(generic.CreateView):
    template_name = 'app/example.html'
    form_class = forms.SomeForm
    model = models.SomeModel
        
    def get_context_data(self, **kwargs):
        context = super(Something, self).get_context_data(**kwargs)
        context["form_1"] = context["form"]
        context["form_2"] = forms.SomeForm2(**self.get_form_kwargs())
        return context

【讨论】:

以上是关于Django 基于类的视图:覆盖表单名称的主要内容,如果未能解决你的问题,请参考以下文章

基于 Django 类的视图加载另一个带有数据的表单

Django 基于类的视图是不是自动为模板分配表单值

基于 Django 类的视图:发布表单数据返回 302 Found 状态码

Django 在基于类的视图中处理多个表单

将 html 表单数据获取到基于 django 类的视图中

如何使用基于类的视图在同一模板中使用两个不同的 Django 表单