Django: сбой ограничения NOT NULL: список желаний_wish.user_id

#python #django

#python #django

Вопрос:

У меня есть приложение списка желаний с пользовательской моделью пользователя. Я добавил пользователя в качестве внешнего ключа к каждому элементу списка желаний. Однако я могу добавить внешний ключ, указав пользователя по умолчанию, даже после удаления существующих файлов БД и запуска makemigrations и migration. Пользователь по умолчанию связан с элементом списка желаний независимо от того, какой пользователь вошел в систему, и если я не включаю пользователя по умолчанию, я получаю ошибку «НЕ удалось выполнить ограничение NOT NULL: список желаний_wish.user_id».

Как я могу обновить код, чтобы элемент списка желаний был связан с зарегистрированным пользователем, создающим элемент?

Связанный с этим вопрос заключается в том, нужно ли мне включать идентификатор пользователя в мою пользовательскую модель пользователя? Я тоже попытался это сделать и столкнулся с той же проблемой. Заранее спасибо.

Модель желаний:

 class Wish(models.Model):
    name = models.TextField()
    user = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE, default=1)

    def __str__(self):
        return self.name
 

Просмотр желаний:

 def add_wish(request):

    user = request.user
    wishes = Wish.objects.filter(user=request.user)

    if request.method == 'POST':
        form = WishForm(request.POST)

        if form.is_valid():
            form.save()
            return redirect('home')
    else:
        form = WishForm()

    context = {'form' : form, 'wishes' : wishes}
    return render(request, 'wishlist/add_wish.html', context)
 

Форма желания:

 class WishForm(ModelForm):
    class Meta:
        model = Wish
        fields = ('name', )

    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        self.fields['name'].widget.attrs.update({'class' : 'textarea', 'placeholder' : 'Enter wishlist item'})
 

Пользовательская модель пользователя (учетной записи):

 class MyAccountManager(BaseUserManager):
    def create_user(self, email, username, first_name, last_name, password=None):
        if not email:
            raise ValueError("Users must provide an email to create an account.")
        if not first_name:
            raise ValueError("Users must provide full name to create an account.")
        if not last_name:
            raise ValueError("Users must provide full name to create an account.")

        user =  self.model(
                email = self.normalize_email(email),
                username = username,
                first_name = first_name,
                last_name = last_name,
            )

        user.set_password(password)
        user.save(using=self._db)
        return user
    
    def create_superuser(self, email, username, first_name, last_name, password):
        user =  self.create_user(
                email = self.normalize_email(email),
                username = username,
                first_name = first_name,
                last_name = last_name,
                password = password
            )
        user.is_admin = True
        user.is_staff = True
        user.is_superuser = True
        user.save(using=self._db)
        return user


class Account(AbstractBaseUser):
    email = models.EmailField(max_length=100, unique=True)
    username = models.CharField(max_length=100, unique=False, blank=True, null=True)
    date_joined = models.DateTimeField(auto_now_add=True)
    last_login = models.DateTimeField(auto_now=True)
    is_admin = models.BooleanField(default=False)
    is_active = models.BooleanField(default=True)
    is_staff = models.BooleanField(default=False)
    is_superuser = models.BooleanField(default=False)
    first_name = models.CharField(max_length=100)
    last_name = models.CharField(max_length=100)

    USERNAME_FIELD = 'email'
    REQUIRED_FIELDS = ['username', 'first_name', 'last_name']

    objects = MyAccountManager()

    def __str__(self):
        return self.first_name   " "   self.last_name

    def has_perm(self, perm, obj=None):
        return self.is_admin

    def has_module_perms(self, app_label):
        return True
 

Ответ №1:

Вам просто нужно указать значение .user для Wish создаваемого вами:

 from django.contrib.auth.decorators import login_required

@login_required
def add_wish(request):
    wishes = Wish.objects.filter(user=request.user)

    if request.method == 'POST':
        form = WishForm(request.POST)

        if form.is_valid():
            form.instance.user = requst.user
            form.save()
            return redirect('home')
    else:
        form = WishForm()

    context = {'form' : form, 'wishes' : wishes}
    return render(request, 'wishlist/add_wish.html', context) 

Примечание: вы можете ограничить просмотры представлением для пользователей, прошедших проверку подлинности, с
помощью @login_required декоратора [Django-doc].