Django подставить имя пользователя в форму автоматически
Доброго времени суток!
Есть в Django 2 таблицы, связанные между собой. А именно стандартная таблица User и созданная Links с полем user которое является ForeignKey.
forms.py
class AddLink(forms.ModelForm):
full_link = forms.CharField(required=True)
short_link = forms.CharField(required=True)
class Meta:
model = Links
fields = ['full_link', 'short_link']
model.py
class Links(models.Model):
user = models.ForeignKey(User, on_delete=models.CASCADE, blank=True)
full_link = models.CharField('Полные ссылки пользователя', max_length=100)
short_link = models.CharField('Короткие ссылки пользователя', max_length=100)
class Meta:
verbose_name = 'Ccылка'
verbose_name_plural = 'Ссылки'
def __str__(self):
return self.full_link
Есть форма добавления информации в таблицу Links, в котором должно быть 2 поля: full_link и short_link. Соответственно чтобы добавить запись в таблицу Links пользователь вводит в форме 2 значения, но при этом чтобы запись в таблицу была добавлена надо также указать последнюю обязательную графу в виде пользователя, который эту запись добавляет. Как его можно подставить в поле не спрашивая об этом пользователя и по умолчанию подставить текущего авторизованного пользователя?
views.py
def link(request):
if request.method == "POST":
addUserLink = AddLink(request.POST)
if addUserLink.is_valid():
addUserLink.user = request.user
addUserLink.save()
messages.success(request, f'Ссылка добавлена')
else:
addUserLink = AddLink()
return render(request, 'users/links.html', {'userLinks': userLinks, 'title':'Пользовательские ссылки', 'addUserLink': addUserLink})
Исправил views.py, провел миграции. В вопросе обновил код. Все равно выдает ошибку NOT NULL constraint failed: users_links.user_id при попытке сохранить форму. Я так понимаю надо еще как то определить поле user в форме? Его следует записать как CharField?
Ответы (3 шт):
Сделайте поле user необязательным:
user = models.ForeignKey(User, on_delete=models.CASCADE, blank=True)
Не забудьте выполнить миграции.
Далее, во views подставьте авторизированнного пользователя:
if request.method == "POST":
addUserLink = AddLink(request.POST)
if addUserLink.is_valid():
addUserLink.user = request.user
addUserLink.save()
messages.success(request, f'Ссылка добавлена')
Получилось сделать так:
models.py
class Links(models.Model):
author = models.ForeignKey(User, on_delete=models.CASCADE, default=None, blank=True)
full_link = models.CharField('Полные ссылки пользователя', max_length=100)
short_link = models.CharField('Короткие ссылки пользователя', max_length=100)
class Meta:
verbose_name = 'Ccылка'
verbose_name_plural = 'Ссылки'
def __str__(self):
return self.full_link
views.py
def link(request):
if request.method == "POST":
addUserLink = AddLink(request.POST)
print(addUserLink)
if addUserLink.is_valid():
instance = addUserLink.save(commit=False)
instance.author = request.user
instance.save()
messages.success(request, f'Ссылка добавлена')
else:
addUserLink = AddLink()
forms.py
class AddLink(forms.ModelForm):
full_link = forms.CharField(required=True)
short_link = forms.CharField(required=True)
class Meta:
model = Links
fields = ['full_link', 'short_link', 'author']
Не обязательно поле в форму добавлять, если создать объект в место сохранения формы (username + данные полученные из формы).
Например:
if form.is_valid():
username = request.user
first_name = form.cleaned_data['first_name']
last_name = form.cleaned_data['last_name']
email = form.cleaned_data['email']
address = form.cleaned_data['address']
postal_code = form.cleaned_data['postal_code']
city = form.cleaned_data['city']
Model_name.objects.create(username=username,
first_name=first_name,
last_name=last_name,
email=email,
address=address,
postal_code=postal_code,
city=city)