【问题标题】:Inlineformset_factory widgets - object has no attribute 'attrs' errorInlineformset_factory 小部件 - 对象没有属性“attrs”错误
【发布时间】:2016-11-12 19:33:40
【问题描述】:

在 django 中,我制作了这个 inlineformset_factory,并尝试向其中一个字段添加一个小部件。但我得到它缺少“attrs”的错误。然后我添加“attrs”,我得到另一个错误,说“unexpected keyword argument 'attrs'”

这里是 inlineformset_factory。

UNIT_CHOICES = (('dl', 'dl'), ('l', 'l'), ('kg', 'kg'),)

IngredientFormSet = inlineformset_factory(RecipeModel, Ingredient, can_delete=False, extra=MAX_INGREDIENTS, exclude=[], 
    widgets={'unit_type': forms.ChoiceField(attrs={}, label="Måleenhet", required=True, widget=forms.Select, choices=UNIT_CHOICES)})

这是我遗漏的内容。

forms.py:

class AddRecipeForm(ModelForm):
    products = Product.objects.all()
    recipes = RecipeModel.objects.all()
    choices = ()
    iterate = 1
    for product in products:
        if not recipes.filter(title=product.name).exists():
            choices = ((product.name, product.name),) + choices
            iterate += 1
    title = forms.ChoiceField(label="Navn på produktet til oppskriften", required=True, widget=forms.Select, choices=choices)

    class Meta:
        model = RecipeModel
        exclude = []


class IngredientForm(ModelForm):
    title = forms.CharField(max_length=255, widget=TextInput(attrs={'id': 'ingredient_title',
                                                                    'class': 'ingredient_class'}))

    class Meta:
        model = Ingredient
        exclude = ['recipe']

views.py

def add_recipe(request):
    if request.POST:
        form = AddRecipeForm(request.POST)
        if form.is_valid():
            recipe = form.save(commit=False)
            ingredient_formset = IngredientFormSet(request.POST, instance=recipe)
            if ingredient_formset.is_valid():
                recipe.save()
                ingredient_formset.save()
                return redirect('admin_site')
            else:
                return redirect('admin_site')
        else:
            return redirect('admin_site')
    else:
        form = AddRecipeForm()
        ingredient_formset = IngredientFormSet(instance=RecipeModel())
    return render(request, 'admin/add_recipe.html', {
        'form': form,
        'ingredient_formset': ingredient_formset,
    }, context_instance=RequestContext(request))

models.py

class RecipeModel(models.Model):
    title = models.CharField("Navn på produktet", max_length=255, default="")
    kilogram_bottle = models.FloatField("Kg råvare for et produkt", blank=True)
    deciliter_bottle = models.FloatField("Deciliter råvare for et produkt", blank=True)
    description = models.TextField("Oppskrifts detaljer", default="")


class Ingredient(models.Model):
    recipe = models.ForeignKey(RecipeModel, on_delete=models.CASCADE)
    ingredient_title = models.CharField("Navn på ingrediens", max_length=255, default="")
    unit_before = models.FloatField("Råvare", blank=True, null=True)
    unit_after = models.FloatField("Ferdig behandlet råvare", blank=True, null=True)
    unit_type = models.CharField("Måleenhet", max_length=255)

【问题讨论】:

    标签: django attr inline-formset


    【解决方案1】:

    由于您正在指定小部件,因此您不必再次指定字段类型。

    widgets={
        'unit_type': forms.Select
    }
    

    但您似乎正在尝试对该字段进行更多操作,因此您可以创建一个模型表单,并将其作为参数传递。

    class RecipeForm(forms.ModelForm):
        ...
        forms.ChoiceField(label="Måleenhet", required=True, widget=forms.Select(attrs={}), choices=UNIT_CHOICES)
    
    inlineformset_factory(RecipeModel, Ingredient, form=RecipeForm, can_delete=False, extra=MAX_INGREDIENTS)
    

    You can read more on this topic here

    另外,请注意attrs 是小部件上的属性,而不是表单字段

    【讨论】:

    • 我添加了与表单相关的大部分其他代码。我确实设置了与您类似的设置,但看到“unit_type”如何成为外键模型的字段。我把它放在它自己的模型中。我正在视图中的两种形式之间建立联系(我认为这就是我所做的)。
    猜你喜欢
    • 2015-08-07
    • 1970-01-01
    • 2018-05-07
    • 1970-01-01
    • 1970-01-01
    • 2020-02-23
    • 2013-01-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多