KeyError в /partners/create/ 'name'

У меня есть модельный партнер, который связан с продуктом отношениями один ко многим. Я использую наборы inlineform для продукта и получаю следующую ошибку, которую я не понимаю:"KeyError at /partners/create/ 'name'"

мои взгляды таковы:

def partner_create(request):   
    if not request.user.is_staff or not request.user.is_superuser:
        raise Http404

    ProductFormSet = inlineformset_factory(Partner, Product, form=ProductForm, extra=3, min_num=1)

    if request.method == 'POST':
        partnerForm = PartnerForm(request.POST or None, request.FILES or None)
        formset = ProductFormSet(request.POST, request.FILES, queryset=Product.objects.none())

        if partnerForm.is_valid() and formset.is_valid():

            instance = partnerForm.save(commit=False)
            instance.save()

            for form in formset.cleaned_data:
                name = form["name"]
                description = form["description"]
                price = form["price"]
                image = form["image"]


                product = Product(partner=instance, name=name, description=description, price=price, product_image=image)
                product.save()
            messages.success(request, "Partner Successfully Created")
        else:
            print partnerForm.errors, formset.errors
    else:
        partnerForm = PartnerForm()
        formset = ProductFormSet(queryset=Product.objects.none())
    return render(request, "partner_form.html", {"partnerForm": partnerForm, "formset": formset})

мои формы.пи следующие:

class PartnerForm(forms.ModelForm):
    mission = forms.CharField(widget=PagedownWidget(show_preview=False))
    vision = forms.CharField(widget=PagedownWidget(show_preview=False))
    # publish = forms.DateField(widget=forms.SelectDateWidget)
    class Meta:
        model = Partner
        fields = [
            "name",
            "logo",
            "banner_image",
            "mission",
            "vision",
            "website_link",
            "fb_link",
            "twitter_link",
            "ig_link",
        ]
class ProductForm(forms.ModelForm):
    image = forms.ImageField(label='Image')
    class Meta:
        model = Product
        fields = [
            "partner",
            "name",
            "description",
            "price",
            "image",
        ]

Мои модели.py следующие:

def upload_location(instance, filename):
    #filebase, extension = filename.split(".")
    # return "%s/%s" %(instance.name, instance.id)
    PartnerModel = instance.__class__
    exists = PartnerModel.objects.exists()
    if exists:
        new_id = PartnerModel.objects.order_by("id").last().id + 1
    else:
        new_id = 1
    file_name, file_extension = filename.split('.')
    return "%s/%s/%s-%s.%s" %('partner',instance.name, file_name, new_id, file_extension)


class Partner(models.Model):
    name = models.CharField(max_length=120)
    logo = models.ImageField(upload_to=upload_location, 
        null=True, 
        blank=True, 
        width_field="width_field", 
        height_field="height_field")
    banner_image = models.ImageField(upload_to=upload_location,
        null=True, 
        blank=True, 
        width_field="width_field", 
        height_field="height_field")
    mission = models.TextField()
    vision = models.TextField()
    height_field = models.IntegerField(default=0)
    width_field = models.IntegerField(default=0)
    # text = models.TextField()
    website_link = models.CharField(max_length=120)
    fb_link = models.CharField(max_length=120)
    twitter_link = models.CharField(max_length=120)
    ig_link = models.CharField(max_length=120)
    slug = models.SlugField(unique=True)
    updated = models.DateTimeField(auto_now=True, auto_now_add=False)
    timestamp = models.DateTimeField(auto_now=False, auto_now_add=True)


    def __unicode__(self):
        return self.name

    def get_absolute_url(self):
        return reverse("partners:detail", kwargs={"slug": self.slug})
        # return "/partner/%s/" %(self.id)

    def get_markdown(self):
        mission = self.mission
        markdown_text = markdown(mission)
        return mark_safe(markdown_text)


#Creating a many to one relationship so that one can upload many Products
class Product(models.Model):
    partner = models.ForeignKey(Partner, default=None)
    name = models.CharField(max_length=120)
    product_image = models.ImageField(upload_to=upload_location,
    # product_image = models.ImageField(upload_to= (upload_location + '/' + name), Something like this need to append actual product name so these dont just get dumped in the media for partners
        null=True, 
        blank=True, 
        width_field="width_field", 
        height_field="height_field",
        verbose_name='Image',)
    description = models.TextField()
    price = models.DecimalField(max_digits=6, decimal_places=2, null=True)
    height_field = models.IntegerField(default=0)
    width_field = models.IntegerField(default=0)

    def __unicode__(self):              # __unicode__ on Python 2
        return self.name

Мне бы очень хотелось понять, что происходит, а также как это исправить или намек в правильном направлении. Заранее спасибо за вашу помощь!

2 ответа

Решение

Чтобы выяснить, почему вы получаете сообщение об ошибке, вы должны добавить в свой код печать или запись в журнал. Какова стоимость formset.cleaned_data? Это то, что вы думаете, должно быть?

Есть более простой подход, который перебирает формы cleaned_data, Документы показывают, как сохранить набор форм. Вы можете сохранить с commit=Falseзатем установите partner поле перед сохранением в базу данных.

products = formset.save(commit=False)
for product in products:
    product.partner=instance
    product.save()

Обратите внимание, что если вы сделаете это, вам, вероятно, следует переключиться на modelformset_factory вместо inlineformset_factoryи удалить partner из списка полей ProductForm,

Способ сохранения формы набора форм кажется неправильным, используйте что-то вроде

for form in formset.cleaned_data:
    if form.is_valid():
        name = form.cleaned_data.get("name")
        description = form.cleaned_data.get("description")
        price = form.cleaned_data.get("price")
        image = form.cleaned_data.get("image")

Пожалуйста, дайте мне знать, если это работает:)

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