Как изменить данные формы после ее заполнения в Django - PullRequest
0 голосов
/ 03 ноября 2019

Это может быть дубликат, но я пробовал множество решений, но ни одно из них не помогло мне.

views.py

class signup_view(View):
def get(self, request):
    signup_form = SignUpForm()
    return render(request, 'signup.html', {"forms": signup_form})

def post(self, request):
    signup_form = SignUpForm(data=request.POST)
    if signup_form.is_valid():
        email = signup_form.cleaned_data.get('user_email')
        password = signup_form.cleaned_data.get('user_pass')
        print("Original password is: ", password)
        hashed_password = make_password(password)
        print("Hashed password is: ", hashed_password)
        signup_form.inital['user_pass'] = hashed_password 
        signup_form.save()
        request.session['username'] = email
        return render(request, 'main_page.html')
    else:
        return render(request, 'signup.html', {"forms": signup_form})

У меня есть это представление django, которое я заполняю информацией изОднако после отправки запроса мне нужно убедиться, что и пароль, и подтверждение пароля (в формах) совпадают, чтобы я мог их обработать. Я делаю это в функции clean (), которую я опубликую ниже. Однако мне нужно сохранить хешированный пароль в моей базе данных, а не фактический пароль, и я понятия не имею, что я могу сделать, чтобы изменить содержание формы после того, как я уже убедился, что она действительна (не уверен, смогу ли я вообще это сделать).

class SignUpForm(forms.ModelForm):
user_pass_check = forms.CharField(label="Password confirmation", widget=forms.PasswordInput())
class Meta:
    model = AppUser
    fields = ["user_email", "user_country", "user_pass"]
    widgets = {"user_pass": forms.PasswordInput()}

def clean(self):
    cleaned_data = super(SignUpForm, self).clean()
    pass1 = cleaned_data.get('user_pass_check')
    pass2 = cleaned_data.get('user_pass')
    if pass1 != pass2:
        raise forms.ValidationError("The two password fields must match.")
    return cleaned_data

Любая помощь была бы удивительной, я боролся с этим часами. Заранее спасибо!

1 Ответ

1 голос
/ 03 ноября 2019

Это не как это сделать. Вместо этого получите объект модели, сохранив с помощью commit = False, а затем установите пароль для этого объекта перед сохранением на самом деле.

user = signup_form.save(commit=False)
user.user_pass = hashed_password 
user.save()

Однако я надеюсь, что вы не используете собственную аутентификацию. Это то, что вы не должны делать , даже если вы правильно хэшируете пароли. Есть много других проблем безопасности, связанных с аутентификацией, и Django уже проверил их. Не делай этого. Используйте встроенную среду аутентификации и замените свой собственный объект User, если вам нужно.

...