У меня есть интересная проблема, прежде всего как таковая модель:
class Reserva(models.Model):
cliente = models.CharField(max_length = 200)
empleado_de_turno = models.ForeignKey(User, on_delete = models.CASCADE)
Проблема состоит в создании инстанции модели Reserva
atraves вида CreateView
, который создаст одна формуляр, чтобы создавать вышеупомянутую инстанцию, но в формуляре я не хочу, чтобы оно явилось полем empleado_de_turno
я хочу, чтобы оно только явилось полем cliente
и что по умолчанию стоимость поля empleado_de_turno
будьте пользователь, который наставил сеанс в этом моменте.
Хороший, чтобы решать вышеупомянутую проблему, пробуйте изменяя данные, посланные методом POST, в методе get_form_kwargs
:
class ReservaCreateView(CreateView):
model = Reserva
template_name = 'testapp1/example.html'
fields = ['cliente']
success_url = reverse_lazy('home')
def get_form_kwargs(self):
form_kwargs = super().get_form_kwargs()
if form_kwargs.get('data'):
user = User.objects.get(username = self.request.user)
post = self.request.POST.copy()
post['empleado_de_turno'] = str(user.pk)
form_kwargs['data'] = post
return form_kwargs
Случай состоит в том, что оно я не функционирует, всегда у меня выходит эта ошибка:
django.db.utils.IntegrityError: NOT NULL constraint failed: testapp1_reserva.empleado_de_turno_id
Я начал стараться спорить, где точно происходила ошибка, потому что решение метода get_form_kwargs
который я показал раньше, был бы должен решать ошибку, и ошибка происходит в методе form_valid
, специально в form.save()
, здесь исходный код метода form_valid
:
ModelFormMixin:
def form_valid(self, form): """If the form is valid, save the associated model.""" self.object = form.save() return super().form_valid(form)
FormMixin:
def form_valid(self, form): """If the form is valid, redirect to the supplied URL.""" return HttpResponseRedirect(self.get_success_url())
(Я сделал следующее с намерением видеть, как это структура данных, когда была создана инстанция, не опуская полей, и когда было опущено поле empleado_de_turno
, чтобы так мочь отвечать структуру в момент опущения вышеупомянутого поля и в момент изменения вышеупомянутых данных, и так можения решать проблему, предотвращая ошибки)
В методе form_valid
, я напечатал form.data
когда в признаке fields
у него была следующая стоимость:
fields = ['cliente']
После я сделал они сам но в этом случае признак fields
у него была следующая стоимость:
fields = ['cliente', 'empleado_de_turno']
Я напечатал следующего способа в методе form_valid
данные, так как здесь он был, где специально появлялась ошибка и помещалась возможность того, чтобы данные не были посланы, как я изменил их ранее:
def form_valid(self, form):
print(form.data)
Результат печатения этого в 2 случаях был следующим:
<QueryDict: {'csrfmiddlewaretoken': ['SBRSJa0aw4iNJOMPwtQVsFL6V6y1cFMNGne9Kr0fA7YmtYeD8xshhDq6pc1mKjQs'], 'cliente': ['code2'], 'empleado_de_turno': ['1']}>
Это означает, что уже он состоял в том, чтобы он напечатал form.data
в Случае 1 или в Случае 2, данные точно равны, что значит, что проблема не данные в момент изменения их, это что-то еще (прихожу к заключению я).
Так как даже в момент печатения form.is_valid
в методе form_valid
, дай как результат True
.
Тогда: Потому что он дает ошибку, если я отвечаю структуру данных правильно изменять это? Я не нахожу его почувствованным в вышеупомянутую ошибку, весь процесс изменения я это делаю правильно.
Обновление 1:
Многие думают, что в действительности поле empleado_de_turno
жди в form
или в виде объект, я он послал один id
и они могут думать, что это ошибка, но это не так.
Прежде всего, уже я это попробовал, в ves помещения одного id
в поле empleado_de_turno
, я поместил объект, и он давал ту же ошибку.
Разум, которого поле empleado_de_turno
ждет один id
и не объект, - потому что так таково, как об этом управляет вид, по крайней мере, в момент получения данных методом POST, не, потому что он управляет об этом так, так, он, как это решили разработчики Django
.
Это могут подтверждать в Случае 2, не опускается никакое поле, объедаются два поля с нормальностью и он печатается в методе form_valid
вошедшие данные о следующем способе: form.data
.
Напечатав это дай как результат:
<QueryDict: {'csrfmiddlewaretoken': ['SBRSJa0aw4iNJOMPwtQVsFL6V6y1cFMNGne9Kr0fA7YmtYeD8xshhDq6pc1mKjQs'], 'cliente': ['code2'], 'empleado_de_turno': ['1']}>
Ясно возможно наблюдать, что key
empleado_de_turno
он считает стоимостью один id
, не объект.
Там возможно подтверждать, что поле empleado_de_turno
он не ждет как таковой объект, по крайней мере, не в этом этапе вида.