2017-08-11 74 views
0

我只是想爲模型的管理表單中的某個字段配置一個filter_horizo​​ntal小部件。但是當我嘗試使用_set來反轉m2m關係時,出現以下錯誤。當試圖在Django窗體中使用_set時出現AttributeError

我正在創建表單的模型被稱爲Statement。我試圖與一個叫做keywords的領域合作,這個領域用另一個模型繪製了m2m。

class Statement(models.Model): 
    statement_id = models.CharField(max_length=200) 
    title = models.CharField(max_length=200) 
    issue_date = models.DateField("Issue-Date") 
    author = models.ForeignKey(Person) 
    released_by = models.ForeignKey(Organization) 
    keywords = models.ManyToManyField('KeywordInContext') 

所以在形式我嘗試配置filter_horizo​​ntal小部件,但我得到一個屬性錯誤,當我嘗試使用keywords_set

class StatementForm(forms.ModelForm): 
statement_keywords = forms.ModelMultipleChoiceField(
    queryset=KeywordInContext.objects.all(), 
    required=False, 
    label=('Select keywords that you would like to assign to this statement on the left. Keywords that are assigned to this statement are on the right.'), 
    widget=FilteredSelectMultiple(
     verbose_name='Keywords Associated with Statement', 
     is_stacked=False 
    ) 
) 
def __init__(self, *args, **kwargs): 
    super(StatementForm, self).__init__(*args, **kwargs) 
    if self.instance.pk: 
     self.fields['statement_keywords'].initial = self.instance.keywords_set.all() ##CAUSES ATTRIBUTE ERROR 

def save(self, commit=True): 
    statement = super(StatementForm, self).save(commit=False) 
    if commit: 
     statement.save() 
    if statement.pk: 
     statement.keywords_set = self.cleaned_data['keywords'] #change to keyword if need be 
     self.save_m2m() 

    return statement 

該錯誤消息我得到的是

File "./gtr_site/forms.py", line 73, in __init__ 
    self.fields['statement_keywords'].initial = self.instance.keywords_set.all() 
     AttributeError: 'Statement' object has no attribute 'keywords_set' 

什麼混淆我最深的是,這個錯誤信息識別Statement對象的事實,而是提供了我對訪問「keywords_set」屬性(試圖扭轉m2m關係)是不正確的。

問題是什麼?這可能是一個小句法,但這是我認爲我能夠通過這種方式扭轉關鍵字字段的m2m關係的方式。

回答

1

您對聲明的多對多關係,來訪問這個關係throw關鍵字的不keywords_set

statement.keywords.all() 

要訪問的KeywordInContext型號這種關係是拋statement_set

KeywordInContext.statement_set.all() 
相關問題