在Django中建模(外键)

时间:2012-06-29 08:44:52

标签: django

使用案例

  • 注册后,用户必须选择他的公司(不理想,但确定)
  • 公司存储在他的UserProfile
  • 汽车型号和汽车类型有一个foreignKey to company
  • 只显示由用户公司创建的汽车和购物车类型,应显示给用户。

建模:

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')

然而,表格显示下拉列表中的所有车型,而不是公司外键过滤的车型。我错过了什么?

1 个答案:

答案 0 :(得分: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)

此外,将公司作为隐藏字段包含在内,以便您可以引用它而不是将其排除。