模板中未显示 Django 表单错误

时间:2021-05-24 18:15:41

标签: python django django-models django-forms django-templates

当表单无效时,我的 HTML 模板中不会显示任何表单错误。表单放置在相关的轮播中。

我正在调用单个表单元素,而不是呈现为 {{form.as_p}},在这种情况下显示错误。

轮播中的最后一项是密码,如果我将其留空,它将显示一个弹出窗口,上面写着“请填写此字段”,但仅此而已,并且仅适用于该字段。

视图.py

def collapsecard(request):
    if request.method == 'POST':
        create_user_form = CreateUserForm(request.POST)
        safezone_form = SafezoneForm(request.POST)

        if create_user_form.is_valid() and safezone_form.is_valid():
            user = create_user_form.save()
            safezone = safezone_form.save(commit=False)

            safezone.userid = user
            safezone.useremail = user.email
            safezone.save()

            user = authenticate(username=create_user_form.cleaned_data['username'],
                                password=create_user_form.cleaned_data['password1'],
                                )
            login(request,user)

            api_key = 'XYZ'
            api_secret = 'XYZ'
            id = 'XYZ'

            mailjet = Client(auth=(api_key, api_secret))

            data = {
                'Email': safezone.useremail,
                'Action': "addnoforce"
            }
            result = mailjet.contactslist_managecontact.create(id=id, data=data)
            print
            result.status_code
            print
            result.json()

            return redirect('safezoneaddedpage')

        return render(request, 'V2maparonno_create_safe_zoneV2.html',
                      {'create_user_form': create_user_form, 'safezone_form': safezone_form})

    else:
        create_user_form = CreateUserForm()
        safezone_form = SafezoneForm()
        print(create_user_form.errors)
        print(safezone_form.errors)
    return render(request, 'V2maparonno_create_safe_zoneV2.html',
                  {'create_user_form': create_user_form, 'safezone_form': safezone_form})

从 HTML 中提取

<form action="" method="POST" class="form-control">
  {% csrf_token %}
  <div id="carouselExampleIndicators" class="carousel slide" data-interval="false" style="width: 100%">
    <ol class="carousel-indicators">
      <li data-target="#carouselExampleIndicators" data-slide-to="0" class="active"></li>
      <li data-target="#carouselExampleIndicators" data-slide-to="1"></li>
      <li data-target="#carouselExampleIndicators" data-slide-to="2"></li>
      <li data-target="#carouselExampleIndicators" data-slide-to="3"></li>
      <li data-target="#carouselExampleIndicators" data-slide-to="4"></li>
    </ol>

    <div class="carousel-inner">
      <div class="carousel-item active">
        <div class="carousel-caption">
          <h5>Drag the marker over your home</h5>
            <div class="longlatinput">
              {{ safezone_form.latitudecentre }}{{ safezone_form.longitudecentre }}
            </div>
          <button class="btn btn-sm btn-outline-primary" type="button" data-slide-to="1" data-target="#carouselExampleIndicators">Next</button>
        </div>
      </div>

      <div class="carousel-item">
        <div class="carousel-caption">
          <h5>Give your safezone a name</h5>
          <div class="form-inputs">
           {{ safezone_form.name }}
          </div>
          <div class="name_space">
          <button class="btn btn-sm btn-outline-primary" type="button" data-slide-to="2" data-target="#carouselExampleIndicators">Next</button>
          </div>
         </div>
      </div>


      <div class="carousel-item">
        <div class="carousel-caption">
          <h5>What email address should we send an alert to?</h5>
          <div class="form-inputs">
            {{create_user_form.email}}
          </div>
          <button class="btn btn-sm btn-outline-primary" type="button" data-slide-to="3" data-target="#carouselExampleIndicators">Next</button>
        </div>
      </div>


      <div class="carousel-item">
        <img src="https://pupaprojectawsbucket.s3.eu-west-2.amazonaws.com/Screenshot+2021-05-04+at+20.36.09.png" alt="..." style="width: 100%; height: 200px;">
        <div class="carousel-caption">
          <h5>Create your username</h5>
          <div class="form-inputs">
            {{create_user_form.username}}
          </div>
          <button class="btn btn-sm btn-outline-primary" type="button" data-slide-to="4" data-target="#carouselExampleIndicators">Next</button>
        </div>
       </div>


      <div class="carousel-item">
        <div class="carousel-caption">
          <h5>Finally, set a password</h5>
          <div class="form-inputs">
            {{create_user_form.password1}}
          </div>
          <input class="btn btn-success" type="submit" name="Submit" id="reset-btn">
          <div class="disclaimer"><p>By clicking submit you agree to receiving email alerts.</p></div>
        </div>
      </div>
    </div>
  </div>
</form>


**<div class = card>
Errors
  {{safezone_form.errors.name}}
  {{create_user_form.errors.email}}
  {{create_user_form.errors.username}}
  {{create_user_form.errors.password1}}
</div>**

Forms.py

    password2 = None

    email = forms.EmailField(widget=forms.EmailInput(attrs={"placeholder": "michael@gmail.com"}))
    username = forms.CharField(widget=forms.TextInput(attrs={"placeholder": "JohnSmith078"}))
    password1 = forms.CharField(widget=forms.PasswordInput(attrs={"placeholder": "8+ characters"}))

    class Meta:
        model = User
        fields = ['username', 'email', 'password1']

    def clean_password1(self):
        password1 = self.cleaned_data.get('password1')
        try:
            password_validation.validate_password(password1, self.instance)
        except forms.ValidationError as error:
            self.add_error('password1', error)
        return password1


class SafezoneForm(forms.ModelForm, admin.ModelAdmin):
    name = forms.CharField(label='Safezone name',widget=forms.TextInput
    (attrs={'id': 'name', 'label': 'Name of Safezone', 'class': 'form-inputs',"placeholder": "Mum's house"}))
    latitudecentre = forms.FloatField(label='Safezone Latitude',widget=forms.TextInput
    (attrs={'id': 'latitudecentre','class': 'form-inputs',"placeholder": "Latitude"}))
    longitudecentre = forms.FloatField(label='Safezone Longitude',widget=forms.TextInput
    (attrs={'id': 'longitudecentre','class': 'form-inputs',"placeholder": "Longitude"}))
    class Meta:
        model = Safezone
        fields = ['name', 'longitudecentre', 'latitudecentre']

1 个答案:

答案 0 :(得分:1)

您的错误不会显示,因为如果您的表单无效,您将重定向到另一个页面。

if create_user_form.is_valid() and safezone_form.is_valid():
    ...
    return redirect('safezoneaddedpage')

return redirect('safezoneaddedpage') # detelete this, here you must not redirect to another page, but render the same template.

并添加:

return render(request, 'V2maparonno_create_safe_zoneV2.html',
              {'create_user_form': create_user_form, 'safezone_form': safezone_form})