1

使用事例:

  • 登録時に、ユーザーは自分の会社を選択する必要があります (理想的ではありませんが、問題ありません)。
  • 会社は彼の UserProfile に保存されます
  • 車のモデルと車のタイプには、会社の外部キーがあります
  • 表示時には、ユーザーの会社によって作成された車と車のタイプのみがユーザーに表示されます。

モデリング:

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

ただし、フォームは、会社の外部キーによってフィルター処理されたものではなく、すべての車種をドロップダウンに表示します。何が欠けていますか?

4

1 に答える 1

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)

また、会社を非表示フィールドとして含めて、除外するのではなく参照できるようにします。

于 2012-06-29T09:22:22.547 に答える