2013-02-21 58 views
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) 

forms.py:模型與外國鍵

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

如何添加到該表單照片上傳?

+0

MEH,東西長約在線表單集,我想。看看https://docs.djangoproject.com/en/dev/topics/forms/modelforms/#inline-formsets – dmg 2013-02-21 15:54:09

回答

3

至少有兩個可能的答案:

A.使用兩種形式,並將其張貼到了同樣的觀點。先保留Data對象,然後創建Photo對象而不將其提交到數據庫,將數據屬性分配給data實例,然後在photo實例(以下提供示例)上調用.save()

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作爲加密類型,或request.FILES將是空的。

1

添加manualy ImageField形成並在此改變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 
+0

ModelForm(s)應該返回它們創建的對象。我編輯了你的答案來反映這一點。 – Brandon 2013-02-21 16:12:40

+0

謝謝。如果我嘗試上傳照片,我有錯誤:「此字段是必需的」。當然,該字段(照片)不是空的 – user2096122 2013-02-21 17:59:38

+0

請參閱我的更新答案,以查找適用的示例。 – Brandon 2013-02-21 18:19:52