Добавление поля пользователю при создании django

#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. Хорошо, это то, что я видел в документации и на другом веб-сайте, и теперь я понимаю, спасибо, чувак