Работа с наборами форм в Django - Сохранение данных - нарушает ненулевое ограничение
Почему request.user
не прибывает? Это вызывает то, что сохранение не работает должным образом?
я использую print()
функция для проверки рабочего процесса для CreateView
функции, но я думаю, что даже я пытаюсь отследить проблему, я ничего не ловлю.
Должен ли я идти по любому пути: ipdb
может быть, или что мне делать?
Контекст:
У меня есть следующие модели, которые я использую, чтобы связать несколько изображений с моим LodgingOffer
модель, то я работаю с django formsets
:
class LodgingOffer(models.Model):
created_by = models.ForeignKey(settings.AUTH_USER_MODEL,
on_delete=models.CASCADE
)
slug = models.SlugField(max_length=100, blank=True)
offered_services = models.ManyToManyField(
OfferedServices,
related_name="lodgingoffers"
)
# Other fields
def __str__(self):
return "%s" % self.ad_title
def get_absolute_url(self):
return reverse('host:detail', kwargs = {'slug' : self.slug })
# Create slug to Url object, friendly readable
def create_slug(instance, new_slug=None):
slug = slugify(instance.ad_title)
if new_slug is not None:
slug = new_slug
qs = LodgingOffer.objects.filter(slug=slug).order_by("-id")
exists = qs.exists()
if exists:
new_slug = "%s-%s" % (slug, qs.first().id)
return create_slug(instance, new_slug=new_slug)
return slug
def pre_save_lodging_offer_receiver(sender, instance, *args, **kwargs):
if not instance.slug:
instance.slug = create_slug(instance)
pre_save.connect(pre_save_lodging_offer_receiver, sender=LodgingOffer)
# I get file name
def get_image_filename(instance, filename):
title = instance.lodging_offer.ad_title
slug = slugify(title)
return "lodging_offer_images/%s-%s" % (slug, filename)
Ассоциированная модель изображений LodgingOfferImage
class LodgingOfferImage(models.Model):
lodging_offer = models.ForeignKey(LodgingOffer)
image = models.ImageField(upload_to=get_image_filename,
verbose_name='Imagen',)
Соответствующие формы для этих двух моделей:
class LodgingOfferForm(forms.ModelForm):
title = "Crear oferta de alojamiento"
class Meta:
model = LodgingOffer
fields = ('ad_title', 'country', 'city', 'address',
'lodging_offer_type', 'stars', 'check_in', 'check_out',
'offered_services', 'featured_amenities',
'room_type_offered', 'number_guest_room_type', 'bed_type',
'bathroom', 'room_information', 'image', 'room_value',
'additional_description', 'is_taked')
class LodgingOfferImagesForm(forms.ModelForm):
image = forms.ImageField(label='Imagen')
class Meta:
model = LodgingOfferImage
fields = ('image', )
Цель, когда я создаю LodgingOffer, также создает или прикрепляет несколько изображений, работая с django formsets
, CreateView
остается таким образом:
class HostingOfferCreateView(SuccessMessageMixin, LoginRequiredMixin, UserProfileDataMixin, CreateView):
model = LodgingOffer
form_class = LodgingOfferForm
#success_url = reverse_lazy("articles:article_list")
success_message = "Oferta de alojamiento creada con éxito"
def post(self, request, *args, **kwargs):
print('post arrive')
ImageFormSet = modelformset_factory(LodgingOfferImage, form=LodgingOfferImagesForm, extra=3)
lodging_offerForm = LodgingOfferForm(self.request.POST)
formset = ImageFormSet(self.request.POST, self.request.FILES,
queryset=LodgingOfferImage.objects.none())
print('user request before to form valid', self.request.user)
if lodging_offerForm.is_valid() and formset.is_valid():
lodging_offer_form = lodging_offerForm.save(commit=False)
print('user request after form valid', self.request.user)
lodging_offer_form.created_by_id = self.request.user
lodging_offer_form.save()
for form in formset.cleaned_data:
image = form['image']
photo = LodgingOfferImage(lodging_offer=lodging_offer_form, image=image)
photo.save()
messages.success(self.request,
"Yeeew,check it out on the home page!")
#return redirect('host:detail', slug=self.slug_url_kwarg)
#return HttpResponseRedirect(lodging_offer_form.get_absolute_url())
#return self.form_valid(form)
return super(HostingOfferCreateView, self).post(request, *args, **kwargs)
def get_context_data(self, **kwargs):
print('user request in get_context_data', self.request.user)
context = super(HostingOfferCreateView, self).get_context_data(**kwargs)
ImageFormSet = modelformset_factory(LodgingOfferImage,
form=LodgingOfferImagesForm, extra=3)
lodging_offerForm = LodgingOfferForm()
formset = ImageFormSet(queryset=LodgingOfferImage.objects.none())
context['lodging_offerForm'] = lodging_offerForm
context['formset'] = formset
return context
И мой шаблон:
{% extends 'layout.html' %}
{% load staticfiles %}
{% load bootstrap3 %}
{% block body_content %}
<form method="POST" enctype="multipart/form-data">
{% csrf_token %}
{% for hidden in lodging_offerForm.hidden_fields %}
{{ hidden }}
{% endfor %}
{% for field in lodging_offerForm %}
{{ field }} <br />
{% endfor %}
{{ formset.management_form }}
{% for form in formset %}
{{ form }}
{% endfor %}
<input type="submit" name="submit" value="Submit" />
</form>
{% endblock %}
Когда я делаю пост через форму, я получаю это сообщение:
System check identified no issues (0 silenced).
October 21, 2017 - 11:55:03
Django version 1.10.7, using settings 'hostayni.settings.development'
Starting development server at http://127.0.0.1:8000/
Quit the server with CONTROL-C.
[21/Oct/2017 12:02:00] "GET / HTTP/1.1" 200 165408
user request in get_context_data @botibagl@gmail.com
[21/Oct/2017 12:02:02] "GET /host/lodging-offer/new/ HTTP/1.1" 200 23774
post arrive
user request before to form valid @botibagl@gmail.com
Internal Server Error: /host/lodging-offer/new/
Traceback (most recent call last):
File "/home/bgarcial/.virtualenvs/hostayni/lib/python3.6/site-packages/django/db/backends/utils.py", line 64, in execute
return self.cursor.execute(sql, params)
psycopg2.IntegrityError: null value in column "created_by_id" violates not-null constraint
DETAIL: Failing row contains (79, Oferta de alojamiento, CO, Envigado, Calle 40D Sur #3221, null, null, Hotel, 1 estrella, 2017-10-28, 2017-10-28, Toda la propiedad, Para 1 huésped, Cama individual, Baño privado, 12345, dsdsd, 2017-10-21 12:02:43.817295+00, null, oferta-de-alojamiento, f, hosting-host-photos/15061122523583.jpg).
Я знаю, что в запросе POST не отправляет значение created_by
атрибут поля к LodgingOffer
модель, но я пытаюсь это через:
if lodging_offerForm.is_valid() and formset.is_valid():
lodging_offer_form = lodging_offerForm.save(commit=False)
# Send the value to created_by
lodging_offer_form.created_by = self.request.user
lodging_offer_form.save()
по-видимому, что происходит, когда post()
сделано, self.request.user идет до form.is_valid()
называется. Затем после запуска проверки я не могу назначить его lodging_offer_form. created_by_id
поле.