フォームとフォームセットで構成されるビューに UpdateView を使用する際に問題が発生します。
私は次のモデルを持っています:アイテムと写真。
画像は次のように定義されます。
class Picture(models.Model):
id = models.AutoField(primary_key=True)
name = models.CharField(max_length=255, blank=False)
content_type = models.ForeignKey(ContentType, verbose_name="content type",
related_name="content_type_set_for_%(class)s")
object_id = models.PositiveIntegerField()
content_object = generic.GenericForeignKey("content_type", "object_id")
写真を含むモデルがいくつかあります。たとえば、Item モデルでは次のようになります。
class Item(models.Model):
id = models.AutoField(primary_key=True)
name = models.CharField(max_length=255, blank=False)
pictures = generic.GenericRelation(Picture)
私は次のItemCreateFormを持っています:
class ItemCreateForm(ModelForm):
def __init__(self, *args, **kwargs):
super(ItemCreateForm, self).__init__(*args, **kwargs)
class Meta:
model = Item
ピクチャーフォーム:
class PictureForm(forms.ModelForm):
id = forms.IntegerField(widget=forms.HiddenInput)
def __init__(self, *args, **kwargs):
super(PictureForm, self).__init__(*args, **kwargs)
def save(self):
data = self.cleaned_data
obj = Picture(**data);
# do something to obj
# obj.save()
class Meta:
model = Picture
fields = ['id', 'name']
そしてビュー:
class ItemUpdateView(UpdateView):
form_class = ItemCreateForm
template_name = 'item/new.html'
model = Item
success_url = '/items/'
def get_context_data(self, **kwargs):
context = super(ItemUpdateView, self).get_context_data(**kwargs)
item = context['object']
# Dont' create any extra forms when showing an update view
PictureFormSet = formset_factory(PictureForm, extra=0)
return {'form': kwargs['form'],
'picture_formset': UploadFormSet(initial = [ model_to_dict(a) for pic in item.pictures.all()])}
def post(self, request, *args, **kwargs):
self.object = self.get_object()
item_form = ItemCreateForm(request.POST, instance=self.object)
if item_form.is_valid():
item = item_form.save(commit=False)
item.save()
# How do update the pictures?
これは私の urls.py です:
url(r'^items/(?P<pk>\d+)/update/$', ItemUpdateView.as_view(), name='item_update')
テンプレート:
<form action="" method="post" enctype="multipart/form-data">
{% for field in form %}
# do something
{% endfor %}
{{ picture_formset.management_form }}
{% for form in picture_formset.forms %}
# do something
{% endfor %}
<input name="commit" type="submit" value="Submit" />
</form>
私はDjangoが初めてです。
ユーザーは、アイテムと複数の画像を表示するために使用される単一のテンプレートの画像フォームを使用して、動的に (jQuery を介して) 画像を追加/削除できます。
1 写真の非表示フィールドとして ID を含める必要がありました。そうしないと、Update の代わりに写真が挿入されます。QN: これを行うためのより良い方法はありますか?
2 画像モデルを更新するにはどうすればよいですか? 現在request.POST
、モデルにすべてのフィールドが含まれていないため、モデルは NULL フィールドについて不平を言っていますか? URLにpkを含むUpdateViewの簡単な例のように、UpdateViewでフォームセットを処理する方法が完全にわかりません。これはメインフォームではありません。
PictureFormSet = formset_factory(PictureForm)
picture_formset = PictureFormSet(request.POST, request.FILES)
for picture_form in picture_formset.forms:
picture_form.save()