2012-04-11 52 views
4

我在菜谱网站的工作使用Django,并与外键字段在我的形式碰到一个问题Django的隐藏的外键的形式使用元模型

的问题是,当我创建我的食谱,我需要有一个外键指向食谱创建这个配方,但我不希望用户创建食谱看到original_cookbook字段(他们不应该)

我相信我需要使用一个小部件( HiddenInput),但我对其他网站上给出的例子感到困惑。另外我的朋友提到了在original_cookbook视图中设置初始值的一些东西:dr:我想将fk指向用户cookbook,同时保持original_cookbook字段隐藏。

相关的代码:

形式:

class RecipeForm(forms.ModelForm): 

    class Meta: 
     model = Recipe 

模型:

class Recipe(models.Model): 
    def __unicode__(self): 
     return self.name 
    original_cookbook = models.ForeignKey(Cookbook) 
    #cookbooks = models.ManyToManyField('Cookbook', related_name = 'recipes') 
    name = models.CharField(max_length=200) 
    author = models.CharField(max_length= 100) 
    picture = models.ImageField(upload_to = 'Downloads', blank=True) 
    pub_date = models.DateTimeField('date published', auto_now_add=True, blank=True) 
    ingredients = models.TextField() 
    steps = models.TextField() 
    prep_time = models.IntegerField() 
    TYPE_CHOICES= (
    ('SW', 'Sandwich'), 
    ('AP', 'Appetizers'), 
    ('SD', 'Sauces and Dressings'), 
    ('SS', 'Soups and Salads'), 
    ('VG', 'Vegetables'), 
    ('RG', 'Rice, Grains and Beans'), 
    ('PA', 'Pasta'), 
    ('BR', 'Breakfast'), 
    ('MT', 'Meat'), 
    ('SF', 'Seafood'), 
    ('BP', 'Bread and Pizza'), 
    ('DT', 'Desserts'), 
    ) 
    type = models.CharField(max_length = 2, choices=TYPE_CHOICES) 

    def index_queryset(self): 
     return self.objects.all() 

视图:

def createrecipe(request): 
    if not request.user.is_authenticated(): 
     return HttpResponseRedirect('/index/') 
    else: 
     if request.method == 'POST': 
      form = RecipeForm(request.POST) 
      if form.is_valid(): 
       recipe = form.save() 
       user = request.user 
       cookbooks = user.cookbooks 
       cookbook = cookbooks.all()[0] 
       cookbook.recipes.add(recipe) 
       return HttpResponseRedirect('/account') 
     else: 
      form = RecipeForm() 

     return render_to_response('cookbook/createrecipe.html', 
            {'form':form}, 
           context_instance=RequestContext(request)) 

回答

8

exclude = ('original_cookbook',)添加到您的表单的Meta类。

然后,在你if form.is_valid()代码,这样做:

.... 
recipe = form.save(commit=False) 
recipe.original_cookbook = whatever_that_is 
recipe.save() 
... 
+0

是的,这非常感谢 – snackerfish 2012-04-11 21:05:53

0

这在the documentation回答。

from django import forms 
class RecipeForm(forms.ModelForm): 

    class Meta: 
     model = Recipe 
     widgets = {'cookbook': forms.HiddenInput 
+3

这让我隐藏输入,但会在哪里我通过original_cookbook外键?看法? – snackerfish 2012-04-11 21:04:08