Работа с наборами форм в 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 поле.

0 ответов

Другие вопросы по тегам