2012-04-19 54 views
0

我有一個UserAdmin的時候,我定義的UserProfileInline這樣的:強制用戶添加一些InlineModelAdmin的實例添加模型

from ... 
from django.contrib.auth.admin import UserAdmin as UserAdmin_ 

class UserProfileInLine(admin.StackedInline): 
    model = UserProfile 
    max_num = 1 
    can_delete = False 
    verbose_name = 'Profile' 
    verbose_name_plural = 'Profile' 

class UserAdmin(UserAdmin_): 
    inlines = [UserProfileInLine] 

UserProfile模型有一定要求的領域。

我要的是迫使用戶不僅要輸入用戶名&重複密碼,也使被創建並關聯到正在添加的UserUserProfile實例進入至少所需的字段。

如果我在創建用戶時在UserProfileInline的任何字段中輸入任何內容,它將驗證表單沒有問題,但如果我沒有觸及任何字段,它只會創建用戶,並且UserProfile什麼也沒有發生。

有什麼想法?

回答

1

查看最近回答Extending the user profile in Django. Admin creation of users,需要設置內聯的formempty_permitted屬性爲False。就像

class UserProfileForm(forms.ModelForm): 
    def __init__(self, *args, **kwargs): 
     super(UserProfileForm, self).__init__(*args, **kwargs) 
     if self.instance.pk is None: 
      self.empty_permitted = False # Here 

    class Meta: 
     model = UserProfile 


class UserProfileInline(admin.StackedInline):          
    form = UserProfileForm 

另一種可能的解決方案是創建自己的Formset(從BaseInlineFormSet繼承),如建議在this link

這可能是類似的東西:

class UserProfileFormset(BaseInlineFormSet): 
    def clean(self): 
     for error in self.errors: 
      if error: 
       return 
     completed = 0 
     for cleaned_data in self.cleaned_data: 
      # form has data and we aren't deleting it. 
      if cleaned_data and not cleaned_data.get('DELETE', False): 
       completed += 1 

     if completed < 1: 
      raise forms.ValidationError('You must create a User Profile.') 

然後指定在InlineModelAdmin該表單集:

class UserProfileInline(admin.StackedInline): 
    formset = UserProfileFormset 
    .... 

關於第二個方法的好處是,如果用戶配置模式不要求任何要填寫的字段,它仍會要求您至少輸入一個字段中的任何數據。第一種模式沒有。