Django формирует очищенные данные, в которых отсутствуют определенные поля

#python #django #forms

#python #django #формы

Вопрос:

У меня странная проблема с формой, которую я создал для регистрации пользователя с использованием модели пользователя Django customer. Я использую Django 1.6.5.

forms.py

 class SignupForm(forms.ModelForm):
    password1 = forms.CharField(widget=forms.PasswordInput,
                                label=_('Password'),
                                max_length=50)
    password2 = forms.CharField(widget=forms.PasswordInput,
                                label=_('Repeat password'),
                                max_length=50)

    class Meta:
        model = RegisteredUser
        fields = ("firstname", "lastname", "email", "password1", "password2",)

    def clean_email(self):
        existing = RegisteredUser.objects.filter(email__iexact=self.cleaned_data['email'])
        if existing.exists():
            raise forms.ValidationError(_('A user with that email already exists.'))
        return self.cleaned_data['email']

    def clean(self):
        cleaned_data = super(SignupForm, self).clean()
        if 'password1' in self.cleaned_data and 'password2' in self.cleaned_data:
            if self.cleaned_data['password1'] != self.cleaned_data['password2']:
                raise forms.ValidationError(_('The two passwords did not match.'))
        return cleaned_data
  

views.py

 class SignUpView(FormView):
    template_name = 'core/signup.html'
    form_class = SignupForm
    success_url = None

    def post(self, request, *args, **kwargs):
        form = self.get_form(self.get_form_class())
        if form.is_valid():
            return self.form_valid(request, form)
        else:
            return self.form_invalid(form)

    def form_valid(self, request, form):
        new_user = self.register(request, **form.cleaned_data)
        success_url = self.get_success_url(request, new_user)

        try:
            to, args, kwargs = success_url
            return redirect(to, *args, **kwargs)
        except ValueError:
            return redirect(success_url)



    def register(self, request, **cleaned_data):
        RegisteredUser.objects.create_user(email=cleaned_data['username'],
                                           firstname=cleaned_data['firstname'],
                                           lastname=cleaned_data['lastname'],
                                           password=cleaned_data['password2'])
  

Форма возвращает недопустимый, указывая, что ‘password1’ и ‘password2’ являются обязательными полями. Значение явно присутствует в данных post вместе с другими полями.

Независимо от того, что я пробовал, ‘password1’ и ‘password2’ не включены в cleaned_data dict. Я пытался использовать различные другие имена для этих двух полей, просто чтобы убедиться, что ‘password2’ не противоречит чему-либо еще.

Я, вероятно, упускаю из виду что-то очень простое 🙂

Спасибо!

Майк

РЕДАКТИРОВАТЬ 1 — используемый шаблон (извините за div-ад!):

 <section class="container">
        <div class="row">
            <div class="col-md-6 col-sm-6">
                <h2>Create an <strong>Account</strong></h2>
                <form class="white-row" method="post" action="#">
                    {% csrf_token %}
                    <div class="row">
                        <div class="form-group">
                            <div class="col-md-12 col-sm-12">
                                <label>Firstname</label>
                                <input type="text" class="form-control" name="firstname">
                            </div>
                        </div>
                    </div>
                    <div class="row">
                        <div class="form-group">
                            <div class="col-md-12 col-sm-12">
                                <label>Lastname</label>
                                <input type="text" class="form-control" name="lastname">
                            </div>
                        </div>
                    </div>
                    <div class="row">
                        <div class="form-group">
                            <div class="col-md-12 col-sm-12">
                                <label>Email</label>
                                <input type="email" class="form-control" name="email">
                            </div>
                        </div>
                    </div>
                    <div class="row">
                        <div class="form-group">
                            <div class="col-md-6 col-sm-6">
                                <label>Password</label>
                                <input type="password" class="form-control" name="passsword1">
                            </div>
                            <div class="col-md-6 col-sm-6">
                                <label>Repeat password</label>
                                <input type="password" class="form-control" name="passsword2">
                            </div>
                        </div>
                    </div>
                    <div class="row">
                        <div class="col-md-12 col-sm-12">
                            <input type="submit" value="Sign up" class="btn btn-primary pull-right push-bottom" data-loading-text="Loading...">
                        </div>
                    </div>
                </form>
            </div>
  

Комментарии:

1. Не могли бы вы показать свой шаблон? Где вы используете форму, потому что она жалуется, что вы плохо заполняете форму, и вы делаете это в шаблоне

2. Я обновил шаблон. Ошибка, которую я получаю, заключается в том, что требуются password1 и password2. Оба поля являются полями и (как уже упоминалось) присутствуют в данных post в объекте запроса.

3. Я думаю, у вас есть недопонимание форм django, где вы используете {{form}} переменную? куда вы звоните {{form.password1}} и {{form.password2}} ? Вы используете стандартные входные данные, входные данные html <input .... , но когда вы используете форму Django, вам нужно отправить форму в шаблон и вызвать поля типа {{form.password1}} , Django преобразует это во входные данные. Посмотрите мой ответ, как я вызываю поля в шаблоне

4. Вы были совершенно правы. Я был уверен, что до тех пор, пока я «имитировал» имена полей формы, это будет работать. Использование {{ form.password1 }} и т. Д. Решило проблему для меня. Большое спасибо!

Ответ №1:

Вот пример того, как я делаю это в своих проектах:

forms.py:

 class NewUserForm(forms.Form):
    username = ...
    password1 = forms.CharField(widget=forms.PasswordInput, required=True)
    password2 = forms.CharField(widget=forms.PasswordInput, required=True)

    def clean_password2(self):
        password1 = self.cleaned_data.get("password1", "")
        password2 = self.cleaned_data.get("password2", "")
        if password1 and password2:  # If both passwords has value
            if password1 != password2:
                raise forms.ValidationError(_(u"Passwords didn't match."))
        else:
            raise forms.ValidationError(_(u"Passwords can't be blank."))
        return password2
  

views.py:

 @login_required
def add_user(request):
    ''' Adds new user '''

    if request.method == 'POST':
        form = NewUserForm(request.POST)
        if form.is_valid():
            user = form.save()
            # TODO: Save in temporary table
            return HttpResponse('SUBMIT')
    else:
        form = NewUserForm()

    return render_to_response('add_user.html', {'form': form}, context_instance=RequestContext(request))
  

шаблон (пример формы):

 <form action="." method="post" id="add_user_form">
{% csrf_token %}
    {{ form.username }}
    {{ form.password1 }}
    {{ form.password2 }}
    {{ form.usertype }}

    <input type="submit" value="{% trans 'Save' %}" class="default"/>

</form>
  

{% csrf_token %} : Вам нужно поместить это в каждую используемую вами форму

action="." : Это переводит сообщение на фактическую страницу

{{ form.VARIABLE_NAME}} Вам нужно настроить входные данные формы следующим образом: вы создаете форму в представлении, отправляете в шаблон и используете ее как переменную Django с помощью {{ }} . Чтобы задать ввод для одного из ваших полей, как password1 это будет, как я написал выше {{ form.password1}} , вы также можете использовать {{form.errors}} для проверки всех ошибок формы или {{form.VARIABLE_NAME.errors}} для проверки точных ошибок полей в шаблоне