#django
#django
Вопрос:
Похоже, что модель получает только «null». Я попытался напечатать запрос пользователя в представлениях, и все было в порядке.
Просмотр кодов.
def add_item(request): # add new media
quote = random.choice(quotes)
if request.method == "POST":
new_item = MovieForm(request.POST)
new_item.save(commit=False)
new_item.author = request.user
new_item.save()
return redirect('movie:movie_library')
else:
movie_form = MovieForm()
return render(request, 'movie/add_movie.html',
context={'form': movie_form,
'quote': quote})
Модель
class Movie(models.Model):
STATUS_CHOICES = (
('Movie', 'Movie'),
('Tv-series', 'Tv Series'),
('Anime', 'Anime'),
)
author = models.ForeignKey(User, on_delete=models.CASCADE)
title = models.CharField(max_length=50, null=False)
type = models.CharField(max_length=15,
choices=STATUS_CHOICES,
default='')
year = models.IntegerField(null=True, blank=True)
rating = models.FloatField(max_length=10, null=False)
review = models.TextField(null=True, blank=True)
img_url = models.TextField(default='https://betravingknows.com/wp-content/uploads/2017/'
'06/video-movie-placeholder-image-grey.png')
active = models.BooleanField(default=True)
def __str__(self):
return self.title
формы
from django import forms
from movie.models import Movie
class MovieForm(forms.ModelForm):
class Meta:
model = Movie
fields = ('title', 'type', 'year', 'review',
'rating', 'img_url', 'active')
ошибка
django.db.utils.Ошибка целостности: нулевое значение в столбце «author_id» отношения «movie_movie» нарушает ненулевое ограничение ПОДРОБНО: ошибка строки содержит (46, Sapiens, фильм, 435, 6.5, высота, https://betravingknows.com/wp-content/uploads/2017/06/video-movi …, t, null).
Ответ №1:
Не request.user
является ли return AnonymousUser
вместо зарегистрированного? В этом случае author
будет получено None
, что вызовет вашу ошибку. Вы можете добавить декоратор login_required в свой вид, чтобы избежать этого:
from django.contrib.auth.decorators import login_required
@login_required
def add_item(request):
...
Комментарии:
1. @login_required уже существует, и отображается та же ошибка. Без отображения сообщения об ошибке login_required anonymoususer. » (46, Sapiens, Фильм, 435, 6.5, высота, betravingknows.com/wp-content/uploads/2017/06/video-movi …, t, null).» последнее значение «null» здесь присваивается пользователю.
2. Можете ли вы отредактировать свою тему, чтобы отразить фактический код для вида и формы, которые вы используете? Также возникает такая же ошибка с декоратором?
Ответ №2:
Фактически, в вашем коде вы присваиваете значение не request.user
своему новому объекту, а своей форме, поэтому оно не сохраняется.
form.save()
возвращает новый объект, и это то, что вам нужно здесь манипулировать.
Кроме того, рассмотрите возможность обработки случая, когда форма недопустима с form.is_valid()
помощью .
if request.method == "POST":
form = MovieForm(request.POST)
if form.is_valid():
new_item = form.save(commit=False)
new_item.author = request.user
new_item.save()
Надеюсь, это помогло.
Ответ №3:
На всякий случай. Если вы используете фреймворк Django rest и ваш сериализатор настроен следующим образом: author
является внешним ключом. Если ваш POST
запрос пытается создать объект db модели с помощью внешнего ключа, убедитесь, что он не указан как доступный только для чтения.
class PostSerializer(serializers.ModelSerializer):
author = serializers.ReadOnlyField(source='author.username') # just comment this
# author = UserSerializer(read_only=True) # remove this also if present
...
Пожалуйста, удалите часть, доступную только для чтения. Это останавливает ожидаемый результат. Также убедитесь, что author
поле принимает id
тип ForeingKey (здесь User
).