1

用例:

  • 注册后,用户必须选择他的公司(不理想但可以)
  • 公司存储在他的 UserProfile 中
  • 车型和车型有一个对外的公司Key
  • 展示时,仅向用户展示用户公司创建的汽车和车型。

造型:

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。

问题:

-每家公司生产不同的车型。并且感谢公司外键,它已经与另一家公司分开了。

  • 添加新车后,用户应从下拉列表中仅选择其公司明确创建的汽车类型,但是在这种情况下,用户会看到所有的 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')

但是,表单在下拉列表中显示所有汽车类型,而不是由公司外键过滤的汽车类型。请问我错过了什么?

4

1 回答 1

1

您也许可以在 init.xml 中修改选择。这是一个例子:

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)

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

于 2012-06-29T09:22:22.547 回答