#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].