1

私は可能な限りCBVを使用しようとしており、URL経由で渡されたデータを使用してgeneric.CreateViewに基づいてModelFormにデータを事前に入力したいと考えています。

考えすぎたり、混乱したりしているのかもしれません。すべてのコードは読みやすくするために省略されています

PartNumbers (抽象化)、Carriers (PartNumbers の場所、シリアル番号、数量番号を含む実際のインスタンス)、およびアイテムが在庫からいつ取り出されたか、どのくらいの量が取り出され、どのキャリアから来たかを記録するための動きを備えた在庫システムがあります。

PartNumber の詳細ページに「在庫の抽出」リンクを配置し、利用可能な運送業者 ( pn.carrier_set.all() ) を MovementForm の FK ドロップダウンに自動入力したいと考えています。

models.py

class PartNumber(models.Model):
  name = models.CharField("Description", max_length=100)
  supplier_part_number = models.CharField(max_length=30, unique=True)
  slug = models.SlugField(max_length=40, unique=True)

class Carrier(models.Model):
  part_numbers = models.ForeignKey(PartNumber)
  slug = models.SlugField(max_length=10, unique=True, blank=True, editable=False)
  location = models.ForeignKey(Location)
  serial_number = models.CharField(max_length=45, unique=True, null=True, blank=True)
  qty_at_new = models.IntegerField()
  qty_current = models.IntegerField()

class Movement(models.Model):
  carrier = models.ForeignKey(Carrier)
  date = models.DateField(default=timezone.now())
  qty = models.IntegerField()

私は成功せずに get_initial() と get_form_kwargs() で遊んでいます:

urls.pyでは、url を介して PartNumber を pn_slug として収集します。

url(r'^partnumber/(?P<pn_slug>[-\w]+)/extract/$', views.MovementCreate.as_view(), name='pn_extract'),

forms.pyはジェネリックです

class MovementForm(forms.ModelForm):
  class Meta:
    model = Movement

ビュー.py

class MovementCreate(generic.CreateView):
  form_class = MovementForm
  model = Movement

  def get_form_kwargs(self):
    kwargs = super(MovementCreate, self).get_form_kwargs()
    kwargs['pn_slug'] = self.request.POST.get("pn_slug")
    return kwargs

  # here we get the appropriate part and carrier and.
  # return it in the form
  def get_initial(self):
    initial = super(MovementCreate, self).get_initial()
    # this didn't work, hence using get_form_kwargs
    #pn = PartNumber.objects.get(slug=self.request.POST.get("pn_slug"))
    pn = PartNumber.objects.get(slug=self[pn_slug])
    carriers = pn.carrier_set.all()
    initial['carrier'] = carriers
    return initial

現状では、「グローバル名 'pn_slug' が定義されていません」というエラーが表示されますが、エラーが間違ったことを正確に反映しているとは思えません。

これらの投稿を大まかなガイドラインとして使用しています。

初期データでdjangoのジェネリックCreateViewをサブクラス化する方法は?

ModelForm で CreateView を使用する方法

4

1 に答える 1