【问题标题】:Django forms using html elements with different name from moels fieldDjango 表单使用与 moels 字段不同名称的 html 元素
【发布时间】:2020-01-14 21:38:47
【问题描述】:

在我的 django 项目中,我有这个模型:

class UserProfile(models.Model):
    user = models.OneToOneField(User, on_delete=models.CASCADE,)
    u_fullname = models.CharField(max_length=200)
    u_email = models.EmailField()
    u_profile = models.CharField(max_length=1)
    u_job = models.CharField(max_length=100, null=True, blank=True, default='D')
    u_country = models.CharField(max_length=20, null=True, blank=True, default='Italy')
    u_regdata = models.DateTimeField(auto_now=True)
    stripe_id = models.CharField(max_length=100, null=True, blank=True)
    activation_code = models.CharField(max_length=10)
    u_picture = models.ImageField(upload_to='profile_images', blank=True)
    u_active = models.BooleanField(default=False)
    u_terms = models.BooleanField(default=False)

    def __unicode__(self):
        return self.u_profile

还有一个像这样的 forms.py:

from a_profile.models import UserProfile

类 ProfileModelForm(ModelForm):

class Meta:
    model = UserProfile
    fields = ['u_fullname',
              'u_job',
              'u_country',
              'u_email',
              'u_terms',
              ]

def clean(self):
    cleaned_data = super(ProfileModelForm, self).clean()
    u_fullname = cleaned_data.get('u_fullname')
    u_job = cleaned_data.get('u_job')
    u_country = cleaned_data.get('u_country')
    u_email = cleaned_data.get('u_email')
    u_terms = cleaned_data.get('u_terms')

    if not u_terms:
       raise forms.ValidationError("Please read and accept our Terms of Service")

    if not u_fullname and not u_job and not u_country and not u_terms:
        raise forms.ValidationError('You have to write something!')

    return cleaned_data

好吧,现在在 html 中,我必须为与表单字段相关的元素使用不同的名称:

<form action="" method="POST">
    {% csrf_token %}

    {{ form.errors }}
    <div class="row">
        <div class="col-lg-12 no-pdd">
            <div class="sn-field">
                <input type="text" name="u_fullname_C" id="u_fullname_c"
                                                       placeholder="Company Name">
                                                <i class="la la-building"></i>
                                            </div>
                                        </div>
                                        <div class="col-lg-12 no-pdd">
                                            <div class="sn-field">
                                                <select name="u_country_c" id="u_country_c"
                                                        value="{{ form.u_country }}">
                                                    <option selected="selected">Italy</option>
                                                    <option>Spain</option>
                                                    <option>USA</option>
                                                    <option>France</option>
                                                </select>
                                                <i class="la la-globe"></i>
                                                <span><i class="fa fa-ellipsis-h"></i></span>
                                            </div>
                                        </div>
                                        <div class="col-lg-12 no-pdd">
                                            <div class="sn-field">
                                                <select name="u_job_c" id="u_job_c" value="{{ form.u_job }}">
                                                    <option selected="selected">Technology</option>
                                                    <option>Healthcare</option>
                                                    <option>Building</option>
                                                    <option>Aerospace</option>
                                                </select>
                                                <i class="la la-industry"></i>
                                                <span><i class="fa fa-ellipsis-h"></i></span>
                                            </div>
                                        </div>
                                        <div class="col-lg-12 no-pdd">
                                            <div class="sn-field">
                                                <input type="text" name="u_email_c" id="u_email_c"
                                                       placeholder="Enter a valid email"
                                                       value="{{ form.u_email }}">
                                                <i class="la la-envelope"></i>
                                            </div>
                                        </div>
                                        <div class="col-lg-12 no-pdd">
                                            <div class="sn-field">
                                                <input type="password" name="u_password_c" id="u_password_c"
                                                       placeholder="Password">
                                                <i class="la la-lock"></i>
                                            </div>
                                        </div>
                                        <div class="col-lg-12 no-pdd">
                                            <div class="sn-field">
                                                <input type="password" name="repeat-password_c"
                                                       id="repeat-password_c"
                                                       placeholder="Repeat Password"
                                                       onfocusout="return checkPass('C')">
                                                <i class="la la-lock"></i>
                                            </div>
                                        </div>
                                        <div class="col-lg-12 no-pdd">
                                            <div class="checky-sec st2">
                                                <div class="fgt-sec">
                                                    <input type="checkbox" name="u_terms_c" id="u_terms_c">
                                                    <label for="u_terms_c"><span></span></label>
                                                    <span></span>
                                                    </label>
                                                    <small>Yes, I understand and agree to the workwise Terms &
                                                        Conditions.</small>
                                                </div><!--fgt-sec end-->
                                            </div>
                                        </div>
                                        <div class="col-lg-12 no-pdd">
                                            <button type="submit" name="company" value="submit"
                                                    onclick="return checkUserRegForm('C')">Get Started
                                            </button>
                                        </div>
                                    </div>
                                </form>

此时,当我运行我的代码并将数据输入表单时,当我提交时,我收到一个表单错误,因为表单在我的字段中看不到值:

ERROR-> {'u_fullname': [ValidationError(['This field is required.'])], 'u_email': [ValidationError(['This field is required.'])], 'all ': [ValidationError(['请阅读并接受我们的服务条款'])]}

如何将我的表单字段名称链接到我的 html 元素名称值?

提前非常感谢

【问题讨论】:

    标签: django python-3.x django-forms


    【解决方案1】:

    这里是关于主题 rendering fields manually 的文档的链接。

    我看了一会儿,这就是我想出的。我很抱歉我遗漏了一些东西。在您看来,如果您能够获得“国家代码”选项和“工作”选项,您可以在它们的模板中查看它们。

    我添加了 value="{{ form.u_fullname }}"value="{{ form.u_terms }}"

    <form method="" action="">
        {% csrf_token %}
    
        {{ form.errors }}
        <div class="row">
            <div class="col-lg-12 no-pdd">
                <div class="sn-field">
                    <input type='text' name="u_fullname_C" id="u_fullname_c" 
                        value="{{ form.u_fullname }}" placeholder="">
                </div>
            </div>
    
            <div class="col-lg-12 no-pdd">
                <div class="sn-field">
                    <select name="u_country_c" id="">
                        {% for option in options %}
                            <option value="{{ option.pk }}">{{ option.name }}</option>
                        {% endfor %}
                    </select>
                </div>
            </div>
    
            <div class="col-lg-12 no-pdd">
                <div class="sn-field">
                    <select name="u_job_c" id="u_job_c" value="{{ form.u_job }}">
                        {% for job in jobs %}
                            <option value="{{ job.pk }}">{{ job.name }}</option>
                        {% endfor %}
                </div>
            </div>
    
            <div class="col-lg-12 no-pdd">
                <div class="sn-field">
                    <input type='text' name='u_email_c' id='u_email_c' placeholder="" value="{{ form.u_email }}">
                    <i class="la la-envelope"></i>
                </div>
            </div>
    
            <div class="col-lg-12 no-pdd">
                <div class="sn-field">
                    <input type="password" name="u_password_c" id="u_password_c" placeholder="Password">
                    <i class=""></i>
                </div>
            </div>
    
            <div class="col-lg-12 no-pdd">
                <div class="sn-field">
                    <input type="password" name="repeat-password_c" id="repeat-password_c" placeholder="" onfocusout="return checkPass('C')">
                </div>
            </div>
    
            <div class="col-lg-12 no-pdd">
                <div class="checky-sec st2">
                    <div class="fgt-sec">
                        <input type="checkbox" value="{{ form.u_terms }}" name="u_terms_c" id="u_terms_c">
                        <label for="u_terms_c"><span></span>
                            <span></span>
                        </label>
                        <small>Yes, I understand and agree to the workwise Terms &
                                                            Conditions.
                        </small>
                    </div>
                </div>
            </div>
    
            <div class="col-lg-12 no-pdd">
                <button type='submit' name='company' value='submit' onclick="return checkUserRegForm('C')">
                    Get Started
                </button>
            </div>  
        </div>
    </form>
    
    

    如果您使用的是类视图

    class ProfileView(CreateView):
        form_class = UserProfileForm
        success_url = '/'
    
        def form_valid(self, form):
            user_profile = form.save(commit=False)
            user_profile.updated = datetime.datetime.now()
            user_profile.save()
            return super().form_valid(form)
    

    或者函数视图:

    def user_profile_view(request):
        if request.method == 'POST':
            form = ProfileModelForm(request.POST)
            if form.is_valid():
                cd = form.cleaned_data
                fullname = cd['u_fullname']
                UserProfile.objects.create(user=request.user, u_fullname=fullname)
    
                return redirect('')
        else:
            form = ProfileModelForm()
    

    您能提供您的views.py 文件吗?我对 Django 还是半新的,所以如果你还有问题,请告诉我。

    【讨论】:

      猜你喜欢
      • 2016-06-02
      • 1970-01-01
      • 1970-01-01
      • 2019-10-24
      • 2012-11-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-06-26
      相关资源
      最近更新 更多