Почему выполнение form.is_valid () приводит к удалению полей экземпляра, которые не находятся в форме в django? - PullRequest
0 голосов
/ 04 июня 2019

Предположим, это представление для записи редактирования:

def edit_post(request, slug):
    post = get_object_or_404(Post, slug=slug)
    if request.method == "POST":
        form = AddPostForm(request.POST, request.FILES, instance=post)
        # 1
        if form.is_valid():
            # 2
            new_post = form.save(commit=False)
            new_post.save() 
            return redirect('administrator:view_admin_post')
    ...

Теперь предположим, что это:

  1. У меня есть field1, то естьсуществуют в POST модели.

  2. field1 имеет значение по умолчанию и предположим, что текущее значение field1 зависит от предыдущего.

  3. Также предположим, что я не хочупередать field1 пользователю.В результате у меня не будет этого в request.POST.

В этой ситуации, когда я пишу print(post.field1) В строке # 1, у меня есть предыдущее значение, но когда я печатаю это в строке # 2 Я получил None!

Что происходит? И как мне получить мое post.field1?

Примечание: Я знаю, что могу определить переменную промежуточного программного обеспечения и сохранить предыдущее значение в этомпеременная. Но есть ли лучший способ сделать это?

1 Ответ

1 голос
/ 05 июня 2019

Первый пункт: .is_valid() НЕ коснется вашей базы данных (если вы не настроите проверку формы, но тогда, ну, вы знаете, почему xD). Это вызов Model.save() (напрямую или через form.save()), который перезаписывает предыдущее значение.

Второй момент: если вы передаете экземпляр модели в вашу форму (что вы и делаете), вы можете получить к нему доступ (и к ее полям) через {{ form.instance.your_field_name }} в шаблоне.

И, наконец, вы можете полностью исключить поле модели из ModelForm или отметить его как доступное только для чтения.

Все это довольно хорошо задокументированный FWIW, поэтому я любезно предлагаю вам потратить некоторое время на чтение документа, прежде чем идти дальше с причудливыми и запутанными "решениями" (подсказка: вам определенно не нужно промежуточное программное обеспечение, чтобы получить первоначальное значение , он все еще находится в вашей базе данных - пока вы его не перезапишите).

...