2016-07-10 15 views
0

In django habe ich diese inlineformset_factory gemacht und ich habe versucht, ein Widget zu einem der Felder hinzuzufügen. Aber ich bekomme den Fehler, dass es "attrs" fehlt. Ich füge dann die "attrs" hinzu und ich bekomme einen anderen Fehler, der "unerwartetes Schlüsselwortargument 'attrs'"Inlineformset_factory widgets - Objekt hat kein Attribut 'attrs' Fehler

sagt Hier ist die 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)}) 

Hier ist das Zeug, das ich weggelassen habe.

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) 

Antwort

0

Da Sie die Widgets angeben, müssen Sie das Feld nicht angeben tippe nochmal.

widgets={ 
    'unit_type': forms.Select 
} 

Aber es sieht aus wie Sie ein wenig mehr mit dem Feld zu tun versuchen, so dass Sie eine Modelform erstellen können, und übergeben Sie das als Argument.

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

Beachten Sie auch, dass attrs ein Attribut auf das Widget, nicht das Formularfeld

+0

ich die meisten anderen Code relevant zu dem Formular hinzugefügt. Ich habe es ähnlich wie Sie eingerichtet, aber sehen, wie "unit_type" ein Feld des Fremdschlüsselmodells ist. Ich habe es in seine eigene Modellform gebracht. Und ich stelle die Verbindung zwischen den beiden Formen in der Ansicht her (ich glaube, das habe ich getan). –