如何在使用CreateView创建的Django表单中设置初始值

4

我有一个表单,希望在字段中设置一些默认值。我最初使用的View类解决方案可行。

# forms.py
ResultForm(forms.ModelForm):

    class Meta:
        model = Result
        fields = ("date", "club", "goals_for", "goals_against")
    ...
    @staticmethod
    def get_initial():
        initial = {
            'date': datetime.today().date(),
            'goals_for': 0,
            'goals_against': 0,
        }
        return initial

并且

# views.py
class EnterResultView(View):
    template = 'results/enter_result.html'

    def get(self, request):
        form_class = ResultForm()
        form_class.initial = form_class.get_initial()
        context = {
            'form_class': form_class
        }
        return render(request, self.template, context)

但是如果我转换为CreateView,就无法初始化字段

# views.py
class EnterResultView(CreateView):
    template_name = 'results/enter_result.html'
    form_class = ResultForm
    form_class.initial = form_class.get_initial()

我该怎么做?

[编辑添加模板]

<!--  results/enter_result.html -->
...
        {% for field in view.form_class %}
            <tr>
                <td style="text-align: right">{{ field.label_tag }}</td>
                <td>{{ field }}</td>
                {% if field.errors %}
                    {% for error in field.errors %}
                        <td class="form-error">{{ error }}</td>
                    {% endfor %}
                {% endif %}
            </tr>
        {% endfor %}
1个回答

3

使用带有FormMixin [Django-doc]的视图具有.get_initial()方法[Django-doc],因此您可以覆盖它:

class EnterResultView(CreateView):
    template_name = 'results/enter_result.html'
    form_class = ResultForm

    def <b>get_initial</b>(self):
        return self.form_class.get_initial()

CreateView 构造一个表单,并将其作为 form 传递给视图,你不应该使用 view.form_class,因为那会构造出一个没有任何参数的 新表单

{% for field in <b>form</b> %}
    …
{% endfor %}

@Psionman:换句话说,它将使用类似于您提供的那些方式创建带有ResultForm(initial={'date': ..., 'goals': ..., ...})ResultForm,但是表单以后如何处理,当然取决于您如何实现您的ModelForm以及您如何渲染表单。 - Willem Van Onsem
@Psionman:根据你的通用 EnterResultView(View),你确实使用了 .initial 属性。 - Willem Van Onsem
我每次都从菜单加载表单。如果我按照你建议的更改代码,该字段将不会初始化。 - Psionman
我理解使用post方法不会初始化表单。如果我从菜单中调用它,我希望它设置默认值。但是当我这样做时,get_initial方法被调用,但数据不会出现在字段中。表单类中的唯一其他代码与验证相关。 - Psionman
获取初始值:def get_initial(self): - Psionman
显示剩余4条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接