2012-11-24 34 views
0

我似乎错过了一些东西。我试图让用户为他们的写作选择一种流派,然后将其设置为来自Work(写作)表/模型的流派表格/模型的外键。Django:如何使用表单数据设置ForeignKey

错误:Django AttributeError: 'str' object has no attribute '_default_manager' 这就是我现在要做的。

Form.py

class post_ow(forms.Form): 
    def __init__(self, *args, **kwargs): 
     super(post_ow, self).__init__(*args, **kwargs) 
     self.fields['one_shot'].label = "Single Chapter or Multiple Chapters" 
     c = [] 
     genre = Genre.objects.filter(poem = False).order_by('name') 
     for b in genre: 
      c.append((b.id,b.name)) 
     self.fields['genre'] = forms.ChoiceField(choices = c) 

    title = forms.CharField(error_messages = {'required' : 'Title Required'}, widget= forms.TextInput(attrs={'style':'width=600px'})) 
    summery = forms.CharField(widget = forms.Textarea(), error_messages= {'required' : 'Summery Required'}) 
    genre = forms.ChoiceField(choices =()) 
    one_shot = forms.ChoiceField(choices = (
     ('one', 'Single Chapter'), 
     ('multi', 'Multiple Chapters'), 
     )) 

Model.py

class Genre(models.Model): 
    name = models.CharField(max_length=20) 
    poem = models.BooleanField() 
    ordernumber = models.IntegerField() 
    def __unicode__(self): 
     return self.name 

class Work(models.Model): 
    title = models.CharField(max_length=30) 
    summery = models.TextField() 
    user = models.ForeignKey(User) 
    date_published = models.DateField() 
    date_updated = models.DateField() 
    one_shot = models.BooleanField() 
    completed = models.BooleanField() 
    genre = models.ForeignKey(Genre) 
    TYPES = (
     ('FF', 'Fan Fiction'), 
     ('OF', 'Original Work'), 
     ('PW', 'Poetry Work'), 
     ) 
    types = models.CharField(max_length=2, choices=TYPES) 
    fandom = models.ForeignKey(Book, blank = True, null= True) 
    def __unicode__(self): 
     return self.title + '-' + self.user.email 

线在view.py造成错误:

g = get_object_or_404('Genre', id = form.cleaned_data['genre']) 
pw = Work(title = form.cleaned_data['title'], summery = form.cleaned_data['summery'], user = request.user, one_shot = True, types = 'pw', 
     date_published = current_date, date_updated = current_date, completed = True, genre = g) 
+0

两个问题:你看到了什么样的错误?请与我们分享。为什么使用简单的'Form'并避免使用'ModelForm'? – marianobianchi

+0

@marianobianchi我使用一个简单的'Form',因为有一些需求(我已经添加了一些),这个表单需要能够处理'ModelForm'不能做的事情。我现在会发布确切的错误。 –

回答

0

更改您的形式 “流派” 字段django documentation说:

genre = forms.ModelChoiceField(queryset=Genre.objects.filter(poem = False).order_by('name')) 

并删除那初始方法。有了这条线,你替换初始值,该字段,并把该标签为“ONE_SHOT”字段,你可以把它作为一个字段的说法:

one_shot = forms.ChoiceField(
    choices = (
     ('one', 'Single Chapter'), 
     ('multi', 'Multiple Chapters'), 
    ), 
    label = "Single Chapter or Multiple Chapters" 
)