ошибка при применении виджета к полю - PullRequest
1 голос
/ 25 июня 2010

Вот моя модель

class RecipeIngredient(models.Model):
    recipe = models.ForeignKey(Recipe)
    ingredient = models.ForeignKey(Ingredient)
    serving_size = models.ForeignKey(ServingSize)
    quantity = models.IntegerField()
    order = models.IntegerField()
    created = models.DateTimeField(auto_now_add = True)
    updated = models.DateTimeField(auto_now = True)

и моя модель формы

class RecipeIngredientForm(forms.ModelForm):
    recipe_ingredient = forms.CharField()

    class Meta:
        model = RecipeIngredient

        widgets = {
            'serving_size' : forms.Select(attrs={'class' : 'test'}), 
            'recipe_ingredient' : forms.TextInput(),
        }

Я получаю следующую ошибку при переходе на страницу

Unhandled exception in thread started by <function inner_run at 0x1010faf50>
Traceback (most recent call last):
  File "/Library/Python/2.6/site-packages/django/core/management/commands/runserver.py", line 48, in inner_run
    self.validate(display_num_errors=True)
  File "/Library/Python/2.6/site-packages/django/core/management/base.py", line 245, in validate
    num_errors = get_validation_errors(s, app)
  File "/Library/Python/2.6/site-packages/django/core/management/validation.py", line 28, in get_validation_errors
    for (app_name, error) in get_app_errors().items():
  File "/Library/Python/2.6/site-packages/django/db/models/loading.py", line 146, in get_app_errors
    self._populate()
  File "/Library/Python/2.6/site-packages/django/db/models/loading.py", line 61, in _populate
    self.load_app(app_name, True)
  File "/Library/Python/2.6/site-packages/django/db/models/loading.py", line 78, in load_app
    models = import_module('.models', app_name)
  File "/Library/Python/2.6/site-packages/django/utils/importlib.py", line 35, in import_module
    __import__(name)
  File "/models.py", line 128, in <module>
    RecipeIngredientFormSet = inlineformset_factory(Recipe, RecipeIngredient, extra=1, form=RecipeIngredientForm)
  File "/Library/Python/2.6/site-packages/django/forms/models.py", line 838, in inlineformset_factory
    FormSet = modelformset_factory(model, **kwargs)
  File "/Library/Python/2.6/site-packages/django/forms/models.py", line 669, in modelformset_factory
    formfield_callback=formfield_callback)
  File "/Library/Python/2.6/site-packages/django/forms/models.py", line 407, in modelform_factory
    return ModelFormMetaclass(class_name, (form,), form_class_attrs)
  File "/Library/Python/2.6/site-packages/django/forms/models.py", line 220, in __new__
    opts.exclude, opts.widgets, formfield_callback)
  File "/Library/Python/2.6/site-packages/django/forms/models.py", line 178, in fields_for_model
    formfield = formfield_callback(f, **kwargs)
TypeError: <lambda>() got an unexpected keyword argument 'widget'

но если я удалю эту строку из моей RecipeIngredientForm, ошибка исчезнет

'serving_size' : forms.Select(attrs={'class' : 'test'}), 

Есть идеи, что я сделал не так?

Ответы [ 2 ]

1 голос
/ 23 апреля 2012

Я столкнулся с подобной проблемой.

Я указал пользовательский kwarg "form" в конструкторе modelformset_factory.Это будет последовательно терпеть неудачу с ошибкой, которую вы описываете, в то время как в этом классе формы были определены пользовательские виджеты, указанные в его мета-классе:

class MyForm(forms.ModelForm):
  class Meta:
    model = MyModel
    widgets = {
        'myField' : forms.fields.TextInput(attrs={'readonly':'readonly'}),
    }

MyFormFactory = modelformset_factory(MyModel,form=MyForm)

Изменение класса формы для указания пользовательских виджетов в методе init чтобы решить это:

class MyForm(forms.ModelForm):
  class Meta:
    model = MyModel
  def __init__(self,*args,**kwargs):
    self.fields['myField'].widget = forms.fields.TextInput(attrs={'readonly':'readonly'})
1 голос
/ 26 июня 2010

Только не добавляйте виджет Select в это поле, он ModelChoiceField и все равно отображается как select.Если вы поместите Select виджет в ModelChoiceField, он не будет правильно отображаться (будет отображаться Unicode вывод в value вместо идентификатора).

Также вам не нужен первыйCharField, если вы не хотите вводить текст с автозаполнением.

Чтобы показать элемент ввода с пользовательскими атрибутами, используйте тег {% field%}:

{% field myform.myselect class="XYZ" %}

, чтобы отобразить его в

<select name="..." class="XYZ">...

Думаю, вы согласитесь с тем, что настраивать классы и шаблоны внутри форм или моделей - плохая идея.Это делает невозможным отладку шаблонов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...