2012-04-17 123 views
3

如何更改Inline類中字段的選擇?我不能在Inline中使用formfield_for_choice_field,那麼要使用什麼? 我必須在管理員中生成它,因爲我需要通過請求。Django的管理員 - 如何改變內聯的選擇?

class YourInline(admin.StackedInline): # or TabularInline 
    model = YourModelName 

    def formfield_for_choice_field(self, db_field, request=None, **kwargs): 
     if db_field.name == 'YOUR_FIELD_NAME': 
      kwargs['choices'] = (('', '---------'), ('1', 'Choice1'), ('2', 'Choice2')) 
     return db_field.formfield(**kwargs) 

好運

+0

內聯使用簡單的表單,因此您可以使用該表單進行任何操作。你究竟在做什麼? – ilvar 2012-04-18 04:05:13

+0

我需要更改內聯1字段的選擇列表。我不能在模型中這樣做,因爲我必須使用請求來檢查管理員中的用戶權限和註冊模型。是否可能以某種方式將請求傳遞給窗體,然後在自定義內聯窗體中對該字段進行一些修改? – tunarob 2012-04-18 06:27:49

+0

它是你的領域的一個外鍵? – eos87 2012-04-18 16:33:22

回答

4

如果你的領域是IntegerField或Charfield與選擇屬性,你可以在內嵌類像這樣覆蓋formfield_for_choice_field方法eos87的答案。但這只是一個部分解決方案。保存時,由於將原始模型的選項用於驗證,因此會出現驗證錯誤。要解決這個問題,請將此函數添加到您的模型中:

def clean_fields(self, exclude=None): 
    exclude.append('YOUR_FIELD_NAME') # we will do our own validation on this field 
    super(YOUR_MODEL, self).clean_fields(exclude = exclude) 

    value = self.YOUR_FIELD_NAME 
    if value and not self.validChoice(value): 
     msg = 'Select a valid choice. %s is not one of the available choices.' 
     errors = {''YOUR_FIELD_NAME'': ([msg % value])} 
     raise ValidationError(errors) 

def validChoice(self, value): 
    # add your validation code here 
+0

我嘗試過,但保存和模型中的字段沒有選擇參數它不能被保存,我得到__init__錯誤。當我在模型中放置空選項並使用您給出的解決方案時,出現錯誤,所選的選項是錯誤的:/ – tunarob 2012-04-18 20:33:55

+1

您必須至少放置一個選項,例如, ((1,'1'),),那麼上面的方法將覆蓋那個選擇。 – eos87 2012-04-18 20:54:35

+1

明天我會檢查一下。我發現您的解決方案與文檔中顯示的解決方案有一個區別(https://docs.djangoproject.com/en/1.3//ref/contrib/admin/#django.contrib.admin.ModelAdmin.formfield_for_choice_field)。您返回 'db_field.formfield(** kwargs)'當字段發現,而文檔說只返回 'super(MyModelAdmin,self).formfield_for_choice_field(db_field,request,** kwargs)'。 希望它會工作:) – tunarob 2012-04-18 21:16:52

0

在我的情況下,表單選項必須填寫,希望能幫助任何人。

# admin.py 
class YourInlineForm(forms.ModelForm): 
    class Meta: 
     fields = '__all__' 
     model = YourModelName 
     widgets = { 
      'level': forms.widgets.Select(
       choices = (
        (0,'A'), 
        (1,'B'), 
        (2,'C'), 
       ), 
      ) 
     } 

# admin.py 
class YourInline(admin.StackedInline): # or TabularInline 
    model = YourModelName 
    form = YourInlineForm 

    def formfield_for_choice_field(self, db_field, request=None, **kwargs): 
     if db_field.name == 'YOUR_FIELD_NAME': 
      kwargs['choices'] = (('', '---------'), ('1', 'Choice1'), ('2', 'Choice2')) 
     return db_field.formfield(**kwargs) 
相關問題