Работая с Django, у меня есть JSONField в моей базе данных (PostgreSQL), где я храню списки словарей с именами и фамилиями актеров. Я хочу сформировать ссылки на фильмы с названием, годом и именами актеров. Имена актеров можно оставить пустыми, и мы должны получить ссылку как "Titani c. 1997.", без каких-либо актеров в списке.
Проблема в том, что я получаю следующую ошибку, когда я не вставка имен любых актеров в формы:
KeyError at / add-source /
'last_name'
...
File "E: \ Pycharm_projects \ movieproject \ movie_project \ movies \ views.py", строка 40, в add_movie 'last_name': actor_form.cleaned_data ['last_name'], KeyError: 'last_name'
I попробовал следующее:
1) изменив параметры JSONField на null = True или blank = True, или оба. Безрезультатно;
2) изменение cleaned_data ['last_name'] на cleaned_data.get ('фамилия') . Это устраняет ошибку, но акторы сохраняются как None None в JSONField и вставляются как пробелы в ссылку (вместо того, чтобы игнорироваться): "Titani c. 1997. Actors:." вместо "Titani c. 1997.".
Вопрос: как я могу избежать ошибки и что я должен сделать, чтобы вставить пустые строки вместо None в JSONField?
Мой код следующий:
mov ie .py:
class Movie(Model):
title = CharField(max_length=400, blank=True)
actors = JSONField(default=dict, blank=True)
year = PositiveSmallIntegerField(blank=True, null=True)
В моем forms.py :
class MovieForm(ModelForm):
class Meta:
model = Movie
fields = ['title', 'year']
class ActorForm(Form):
last_name = CharField(max_length=200, required=False)
first_name = CharField(max_length=200, required=False)
ActorFormSet = formset_factory(ActorForm)
В views.py :
def add_movie(request):
actor_formset = ActorFormSet(request.POST or None, prefix='actors')
movie_form = MovieForm(request.POST or None)
context = dict(actor_formset=actor_formset, movie_form=movie_form)
if request.method == 'POST':
if movie_form.is_valid() and actor_formset.is_valid():
movie = movie_form.save(commit=False)
actors_list = []
for actor_form in actor_formset:
actor = {
'last_name': actor_form.cleaned_data['last_name'],
'first_name': actor_form.cleaned_data['first_name'],
}
actors_list.append(actor)
movie.actors = actors_list
movie.reference = movie.create_reference
movie.save()
return redirect(reverse('index'))
else:
return render(request, 'movies/add-movie.html', context)
else:
return render(request, 'movies/add-movie.html', context)