#python #django #forms #user-registration
#python #django #формы #пользователь-регистрация
Вопрос:
Я хочу добавить поле «full_access» пользователю, когда он регистрируется на моем сайте. Это поле по умолчанию равно False, и когда пользователь выполняет определенное действие (здесь, покупает продукт), у него есть доступ к полному веб-сайту.
Проблема в том, что я не могу добавить это поле при отправке формы.
Вот мой код: весь мой код находится в приложении user
user/forms.py:
from django import forms
from django.contrib.auth.forms import UserCreationForm
from django.contrib.auth.models import User
class SignUpForm(UserCreationForm):
username = forms.CharField(label="Pseudo", required=True, max_length=100, widget=forms.TextInput(attrs={
"class": "form-control",
}))
first_name = forms.CharField(label="Prénom", required=True, max_length=100, widget=forms.TextInput(attrs={
"class": "form-control",
}))
last_name = forms.CharField(label="Nom", max_length=100, required=True, widget=forms.TextInput(attrs={
"class": "form-control",
}))
email = forms.EmailField(label="Email", max_length=150, required=True, widget=forms.EmailInput(attrs={
"class": "form-control",
}))
password1 = forms.CharField(label="Mot de passe", required=True, widget=forms.PasswordInput(attrs={
"class": "form-control",
}))
password2 = forms.CharField(label="Confirmation mot de passe", required=True, widget=forms.PasswordInput(attrs={
"class": "form-control",
}))
full_access = forms.BooleanField(label="Accès total", required=True, disabled=True, initial=False)
class Meta:
model = User
fields = ('username', 'first_name', 'last_name', 'email', 'password1', 'password2', )
user/views.py
def signup(request):
if request.method == "POST":
form = SignUpForm(request.POST)
print(form)
print(form.is_valid())
if form.is_valid():
print("here")
form.save()
username = form.cleaned_data.get('username')
raw_password = form.cleaned_data.get('password1')
user = authenticate(username=username, password=raw_password)
if user is not None:
login(request, user)
return redirect(reverse("accueil"))
else:
form = SignUpForm()
else:
form = SignUpForm()
context = {
"form": form
}
return render(request, "signup.html", context)
Итак, все работает, за исключением того, что поле ‘full_access’ не сохраняется в БД, и я не вижу его в своем интерфейсе администратора
Я посмотрел в Интернете и не могу понять, почему это не слово
Это поле full_access позволяет пользователю перейти на страницу, к которой другие пользователи (которые не платили) не могут получить доступ. Итак, я думаю, что могу передать по разрешению, но мне нужно было бы создать модель для этого, и она мне не нужна для этой страницы (или, может быть, я ошибаюсь)
Я даже не знаю, сохранено ли мое поле ‘full_access’, потому что, если я напишу
{{ user.full_access }} # Doesn't display anything
{{ user.last_name }} # Display the last name
Я пробовал много решений, таких как создание модели для формы и т.д… но я этого не понимаю, и это не работает
Спасибо 🙂
Комментарии:
1.
full_access
не является полем в модели, следовательно, его нельзя сохранить в базе данных.2. Да, это то, что я понял, но как я могу добавить это в модель?
Ответ №1:
Я собирался опубликовать это в качестве комментария, но у меня недостаточно репутации для этого, поэтому я должен опубликовать «ответ»:
Одним из вариантов является расширение базовой модели пользователя. Как объясняется в документации Django, вы делаете это с помощью OneToOneField:
from django.contrib.auth.models import User
class UserPlus(models.Model):
user = models.OneToOneField(User, on_delete=models.CASCADE)
full_access = models.BooleanField(default=False)
Этот подход позволяет хранить информацию о пользователях, специфичную для отдельных пользователей, но технически сохраненную в новой таблице базы данных (в данном примере UserPlus).
Но, честно говоря, лучшим подходом, вероятно, является определение пользовательской модели пользователя. К сожалению, это, вероятно, означает удаление вашей базы данных и ее перестройку после определения вашей пользовательской модели пользователя (в вашей текущей БД вы используете пользовательскую модель по умолчанию, предоставляемую django).
Код для написания пользовательской модели пользователя обширен и несколько выходит за рамки вашего буквального вопроса; итак, вот ссылка на хороший учебник:https://learndjango.com/tutorials/django-custom-user-model
Комментарии:
1. Хорошо, это то, что я видел в документации и на другом веб-сайте, и теперь я понимаю, спасибо, чувак