2013-04-25 3 views
1

У меня есть две базовые модели, которые используют формы модели в администраторе Django. Models.py подобен:Почему мой метод чистых форм ничего не делает?

class FirstModel(models.Model): 
    name = CharField(max_length=100) 
    url = URLField() 
class OtherModel(models.Model): 
    model = models.ForeignKey(FirstModel) 
    ##Other fields that show up fine and save fine, but include some localflavor 

Forms.py похож на:

class FirstModelForm(forms.ModelForm): 
    def clean(self): 
     #call the super as per django docs 
     cleaned_data = super(FirstModelForm, self).clean() 
     print cleaned_data 
    class Meta: 
     model = FirstModel 
#other modelform is the same with the appropriate word substitutions and one field that gets overridden to a USZipCodeField 

Они являются сложены рядный ModelAdmin с ничего особенного в admin.py:

class OtherModelInline(admin.StackedInline): 

    model = OtherModel 
    fields = (#my list of fields works correctly) 
    readonly_fields = (#couple read onlys that work correctly) 

class FirstModelAdmin(admin.ModelAdmin): 
    inlines = [ 
     OtherModelInline, 
     ] 
admin.site.register(FirstModel, FirstModelAdmin) 

У меня есть модель пользователя, форма и ModelAdmin, которая подклассифицирует User и UserCreationForm и переопределяет ее собственный чистый метод. Это работает точно так, как ожидалось. Проблема с FirstModel и OtherModel. Чистые методы, которые я переопределяю в подклассах ModelForm FirstModelForm и OtherModelForm, ничего не делают. Никакое исключение не было выбрано или печать очищенных_данных. Ничего. Все остальное работает так, как ожидалось, но это похоже на то, что мой чистый метод даже не существует. Мне не хватает чего-то простого, но я не вижу, что есть. Любая помощь будет большой. Благодаря!

ответ

1

По умолчанию Django динамически создает модельную модель для ваших администраторов модели. Вы должны указать, что хотите использовать свои собственные формы, установив атрибут формы.

class OtherModelInline(admin.StackedInline): 

    model = OtherModel 
    fields = (...) # if this doesn't work after specifying the form, set fields for the model form instead 
    readonly_fields = (#couple read onlys that work correctly) 
    form = OtherModelForm 

class FirstModelAdmin(admin.ModelAdmin): 
    form = FirstModelForm 
    inlines = [ 
     OtherModelInline, 
     ] 
admin.site.register(FirstModel, FirstModelAdmin) 
+0

Спасибо! Это было именно то, что было, и я должен был знать, потому что я назначил форму в моем User ModelAdmin. Я знал, что это что-то простое, я иногда страдал от серьезной функциональной неподвижности. Еще раз спасибо. –

0

Вам необходимо вернуть cleaned_data из метода clean в форме. Если вы посмотрите на the documentation for cleaning fields that rely on each other вы заметите:

... 
# Always return the full collection of cleaned data. 
return cleaned_data 
+0

Я вижу. Спасибо, но это не приведет к тому, что мой чистый метод ничего не сделает. Должна быть распечатка на консоли моих 'cleaned_data'. –

0

Вполне возможно, что ничего не пережил «чистый» метод родительского. Если вы отправляете данные, которые не будут проверяться из-за способа настройки ваших моделей, cleaned_data будет пустым. Об этом говорится в том же док связаны Тимми, где он говорит:

К тому времени метод форме чистыми() называется, все индивидуальные поля чистые методы будут уже работать (предыдущие две секции), поэтому self.cleaned_data будет заполнен любыми данными, которые до сих пор сохранились. Таким образом, вам также необходимо помнить о том, что поля, которые вы хотите проверить, возможно, не прошли первоначальные проверки отдельных полей.

В этом случае, если у вас есть URLField, проверка поля очень строго, и если вы не определить «verify_exists = False», он будет также проверить, если вы кладете в URL, который возвращает 404. в вашем случае вам нужно будет сделать это, если вы хотите, чтобы допустить, что:

class FirstModel(models.Model): 
    name = CharField(max_length=100) 
    url = URLField(verify_exists=False) 

Вне этого, я понятия не имею, что может быть происходит.

+0

Спасибо за ответ, но не то, что я искал. Хотя я не знал о параметре 'verify_exists', я сейчас. –

+0

Без проблем, рад, что кто-то вас сортировал. Я не использовал встроенный админ уже несколько лет :) – cardonator

Смежные вопросы