2014-04-01 144 views
0

我正在開發一個基於Django的網站。我正在創建表單以供用戶填寫。在Django表單上顯示父字段

首先,我顯示UserProfileForm由用戶填寫,但我需要顯示User類具有的字段'username','first_name'和'last_name'。

其次,我正在顯示一個窗體來創建一個Mascot對象,但我需要顯示一個圖像域,它位於另一個類Image中。

這些都是我的課(models.py):

class Mascot(models.Model): 

    name = models.CharField(max_length=50) 
    race = models.CharField(max_length=50) 
    birth_date = models.DateField(blank=True, null=True) 

    def __str__(self): 
     return self.name 

class Image(models.Model): 
    mascot = models.ForeignKey(Mascot) 
    image = models.ImageField(upload_to = 'pic_folder/%Y/%m/%d', default =  'pic_folder/None/no-img.jpg') 
    is_profile_pic = models.BooleanField() 

這是我的形式(forms.py):

class MascotForm(forms.ModelForm): 

class Meta: 
    model = Mascot 

所以,我需要在MascotForm顯示圖像對象。 謝謝。

回答

0

您可以簡單地添加一個ImageFormField到MascotForm並重寫保存方法也創建圖像實例,就像這樣:

class MascotForm(forms.ModelForm): 
    image = forms.ImageField() 

    class Meta: 
     model = Mascot 

    def save(self, commit=True): 
     # mascot will have to save in this case, we don't pass commit 
     mascot = super(MascotForm, self).save() 
     image = Image.objects.create(mascot=mascot, 
            image=self.cleaned_data.get('image')) 
     return mascot 

這將是一個辦法。但更好的辦法是在這個視圖中有兩種形式。 爲Image模型創建ImageForm並處理視圖中的保存:

class ImageForm(forms.ModelForm): 
     class Meta: 
      model = Image 
      fields = ('image',) 

     def save(self, mascot, commit=True): 
      image = super(ImageForm, self).save(commit=False) 
      image.mascot = mascot 
      if commit: 
       image.save() 
      return image 

    def my_view(request): 
     if request.method == 'POST': 
      mascot_form = MascotForm(request.POST) 
      image_form = ImageForm(request.POST, request.FILES) 

      if mascot_form.is_valid() and image_form.is_valid(): 
       mascot = mascot_form.save() 
       image = image_form.save(mascot) 
       return redirect(....) 
     else: 
      mascot_form = MascotForm() 
      image_form = ImageForm() 
     return render(request, 'some_template.html', { 
      'mascot_form': mascot_form, 
      'image_form': image_form 
     }) 
+0

我遇到了第一種解決方案的麻煩。圖像字段出現在表單中,但我無法上傳選定的圖像。當我點擊提交按鈕時,頁面告訴我圖像字段是必需的,但什麼都不做。 – omaestra

+0

我做到了,我使用了第二種解決方案,現在我在窗體中顯示圖像並上傳。現在我有另一個問題,當我提交表單時,圖像文件獲取默認路徑。 image = models.ImageField(upload_to ='pic_folder /%Y /%m /%d',default ='pic_folder/None/no-png.png') – omaestra

+0

您可以刪除默認值並查看它獲取的路徑嗎? –

相關問題