2012-06-29 40 views
1

使用案例:建模(外鍵)在Django

  • 在註冊時,用戶必須選擇他的公司(不理想,但確定)
  • 公司存儲在他的用戶配置
  • 的汽車模型和汽車類型具有公司的外鍵
  • 僅顯示由用戶公司創建的汽車和手寫體應顯示給用戶。

建模:

class Company(models.Model): 
    company_name  = models.CharField(max_length=50) 

class UserProfile(models.Model): 
    user    = models.OneToOneField(User) 
    company    = models.ForeignKey(Company) 

class Car(models.Model): 
    model_name   = models.CharField(_(u"Model Name")) 
    car_type   = models.CharField(_(u"Car Type")) 
    company    = models.ForeignKey(Company) 

class CarType(models.Model): 
    car_type = models.CharField(_(u"Car Type")) 
    company  = models.ForeignKey(Company) 

查看:

def main_page_view(request): 
    profile = request.user.get_profile() 
    AllCarsCreatedByTheCompany = profile.company.car_set.all() 

這工作已經很完美了,但問題是CarType。

問題:

- 每個公司產生不同的汽車類型。並感謝公司foreignkey,它已經與另一家公司分離。

  • 在添加一個新的汽車時,用戶應該從下拉菜單中只有他的公司已經明確創建的汽車類型選擇,但是在這種情況下,用戶可以看到所有的car_types,甚至沒有他的公司創造的人。

我做了什麼:

def new_car_view(request): 
    profile = request.user.get_profile() 
    if request.method == 'POST': 
     form = CarForm(request.POST) 
     if form.is_valid(): 
      car = Car.objects.create(
       model_name=form.cleaned_data['model_name'], 
       company=profile.company 
      ) 
      car.save() 
      return HttpResponseRedirect('/') 
    else: 
     form = CarForm() 
    variables = RequestContext(request, {'form':form}) 
    return render_to_response('car_add.html', variables) 

表:

class CarForm(ModelForm): 
    class Meta: 
     model = Car 
     exclude = ('company') 

但是形式顯示在下拉列表中,而不是由公司對外過濾以外的所有汽車類型鍵。請問我錯過了什麼?

+0

您已經減少了太多的例子:您在車型或表格中沒有提及汽車類型。你如何顯示下拉菜單? –

+0

@DanielRoseman道歉,你是對的。我剛剛更新了這個問題。謝謝。 – Houman

回答

1

您可能可以修改init中的選擇。這裏是一個例子:

class CarForm(forms.ModelForm): 

    def __init__(self, *args, **kwargs): 

    super(CarForm, self).__init__(*args, **kwargs) 

    # limit selection list to just items for this account 
    self.fields['cartypes'].queryset = CarType(company=company) 

此外,包括公司作爲隱藏領域,所以你可以引用它,而不是排除它。

+0

感謝您的提示。我從視圖'form = CarForm(profile.company)'傳遞,並且在CarForm中,我有一個錯誤,我想:'self.fields ['car_type']。queryset = CarType(company = args)'但現在說'不能(<公司:梅賽德斯有限公司>,)「:」CarType.company「必須是」公司「實例。」但根據調試器,它是一家公司...抱歉,我是Django的新手可能會錯過一些非常明顯的事情 – Houman

+2

這應該是'... queryset = CarType.objects.filter(company = company)'。 –

+0

啊,它的工作原理。非常感謝你們兩位:) – Houman