4
class Data(models.Model):
    title = models.CharField(max_length=255)
    slug = models.SlugField()

class Photo(models.Model):
    photo = models.ImageField(upload_to='img')
    data = models.ForeignKey(Data)

フォーム.py:

class DataForm(ModelForm):
    class Meta:
        model = Data

このフォームに写真をアップロードするにはどうすればよいですか?

4

2 に答える 2

3

考えられる答えは少なくとも 2 つあります。

A. 2 つのフォームを使用して、同じビューに投稿します。Data最初にオブジェクトを永続化し、次にデータベースにコミットせずにオブジェクトを作成し、Photoデータ属性をインスタンスに割り当ててから、インスタンスdataを呼び出します (以下に例を示します)。.save()photo

B. インライン モデル フォームセットを使用する: https://docs.djangoproject.com/en/dev/topics/forms/modelforms/#inline-formsets

[編集]

class Data(models.Model):
    title = models.CharField(max_length=255)
    slug = models.SlugField()

class Photo(models.Model):
    photo = models.ImageField(upload_to='img')
    data = models.ForeignKey(Data)

class DataForm(forms.ModelForm):
    class Meta:
        model = Data

class PhotoForm(forms.ModelForm):
    class Meta:
        model = Photo
        exclude = ('data',)

def your_view(request):
    data_form = DataForm(request.POST or None)
    photo_form = PhotoForm(request.POST or None, request.FILES or None)

    if request.method == 'POST':
        if data_form.is_valid() and photo_form.is_valid():
            data = data_form.save()
            photo = photo_form.save(commit=False)
            photo.data = data
            photo.save()
            # do something else here, like a redirect to another view.
    return render(request, 'your-template.html',
        {'data_form': data_form, 'photo_form': photo_form})

multipart/form-dataフォームがenctype として: を使用していること、またはrequest.FILES空であることを確認してください。

于 2013-02-21T16:07:02.700 に答える
1

ImageFieldFormに manualy を追加しsave、メソッドをオーバーライドして写真を作成します。

class DataForm(ModelForm):
    class Meta:
        model = Data
    photo = forms.ImageField()

    def save(self, *arg, **kwargs):
        data = super(DataForm, self).save(*arg, **kwargs)
        if 'photo' in self.data :
           Photo.objects.create(
              photo=self.data['photo'],
              data=data
           )
        return data
于 2013-02-21T16:08:21.483 に答える