【问题标题】:How to set default selected value in ModelChoiceField while working with ModelForm?使用 ModelForm 时如何在 ModelChoiceField 中设置默认选定值?
【发布时间】:2022-03-21 11:07:16
【问题描述】:

我正在通过 ModelForm 创建一个简单的表格,我制作了 4 个表,其中包含一个主表和 3 个作为主表外键的子表,一切正常。

But I want that there must be selected value in form which will show in the frontend by default.

默认情况下它在 select html 标记中显示 -------- 但我希望它会显示一些标签,就像我的情况一样:如果它显示 默认选择职位描述而不是-----

那么我该如何实现呢?

我的表单.py

from django import forms
from django.utils.translation import gettext_lazy as _
from numpy import empty
from .models import SignUpModel


class SignUpForm(forms.ModelForm):
    first_name = forms.CharField(widget=forms.TextInput(
        attrs={'placeholder': 'First Name'}), required=True, error_messages={'required': 'First Name is required'})
    last_name = forms.CharField(widget=forms.TextInput(
        attrs={'placeholder': 'Last Name'}), required=True, error_messages={'required': 'Last Name is required'})
    email = forms.EmailField(widget=forms.EmailInput(
        attrs={'placeholder': 'Email Address'}), required=True, error_messages={'required': 'Email Address is required'})

    class Meta:
        model = SignUpModel
        fields = ['first_name', 'last_name', 'email', 'password',
                  'company_name', 'job', 'mobile_no', 'country', 'state']
        widgets = {
            'password': forms.PasswordInput(attrs={'placeholder': 'Password'}),
            'company_name': forms.TextInput(attrs={'placeholder': 'Company Name'}),
            'mobile_no': forms.NumberInput(attrs={'placeholder': 'Mobile Number'}),
        }
        error_messages = {
            'password': {
                'required': _('password is required')
            },
            'mobile_no': {
                'required': _('Mobile Number is required')
            },
            'company_name': {
                'required': _('Company Name is required')
            },
            'job': {
                'required': _('Job description must be selected')
            },
            'state': {
                'required': _('State Name is required')
            }
        }

Models.py

    from django.db import models
    from django.contrib.auth.models import User


    class JobType(models.Model):
        job_name = models.CharField(max_length=50)

        def __str__(self):
            return self.job_name
    class Country(models.Model):
        country_name = models.CharField(max_length=50)
        def __str__(self):
            return self.country_name

    class IndianStates(models.Model):
        state_name = models.CharField(max_length=30)
        def __str__(self):
            return self.state_name


    class SignUpModel(User):
        company_name = models.CharField(max_length=80)
        job = models.ForeignKey(JobType, on_delete=models.CASCADE)
        mobile_no = models.PositiveIntegerField()
        country = models.ForeignKey(Country, on_delete=models.CASCADE, blank=True)
        state = models.ForeignKey(IndianStates, on_delete=models.CASCADE)

我的模板文件

<body>

    {% if form %}
    <form method="POST" novalidate>
        {% csrf_token %}
        {% if form.non_field_errors %}
        {% for error in form.non_field_errors  %}
        <div>
            {{error}}

        </div>
        {% endfor %}
        {% endif %}
        {% for field in form %}
        <div>
            {{field}}
            {% for error in field.errors  %}
            <div class="red">
                {{error}}

            </div>
            {% endfor %}
        </div>
        {% endfor %}

        <input type="submit" value="Register">

    </form>
    {% endif %}
    
</body>

Views.py

from django.shortcuts import render
from django.views.generic.base import TemplateView
from . forms import SignUpForm
from django.views.generic.edit import CreateView


class HomeTemplateView(CreateView):
    template_name = 'home/index.html'
    form_class = SignUpForm
    success_url = '/thanks/'


class CreatedThanksTemplate(TemplateView):
    template_name = 'home/thanks.html'

【问题讨论】:

    标签: html django django-models django-views django-forms


    【解决方案1】:

    您可以设置ModelChoiceFieldempty_label=… parameter [Django-doc]。此后我们还需要定义其余的参数,最好在ModelForm的构造函数中设置,所以:

    class SignUpForm(forms.ModelForm):
        # …
        
        def __init__(self, *args, **kwargs):
            super().__init__(*args, **kwargs)
            self.fields['job'].empty_label = 'Select Job Description'
        
        class Meta:
            model = SignUpModel
            # …

    【讨论】:

    • 答案是对的,当我实现它时,它给出了另一个错误'SignUpForm' object has no attribute 'get' during template rendering
    • @Sunderam:您似乎正在使用表单作为视图。或者您在视图中以错误的方式使用表单。
    • @Sunderam:你能用视图和完整的回溯编辑问题吗?
    • @Sunderam:对不起,我打错了,是super().__init__(*args, **kwargs)
    • @Sunderam:不,我编辑了答案,是super().__init__(self, *args, **kwargs)
    猜你喜欢
    • 2014-12-10
    • 1970-01-01
    • 2017-11-10
    • 2018-05-21
    • 2018-07-17
    • 2018-08-09
    • 1970-01-01
    • 2020-06-14
    • 1970-01-01
    相关资源
    最近更新 更多