Django JSONField: ничего не сохраняется вместо пустых строк - PullRequest
0 голосов
/ 22 февраля 2020

Работая с 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)
...