0

です。ビューを使用してユーザープロファイルを更新すると、イメージを除いてすべてがdbに保存されます。フォームは検証中ですが、イメージは保存されていません。私は管理ポータルにログインし、既存のインスタンスにイメージを追加することができます。私は私の問題は私のHTMLテンプレートにあると仮定しますが、私はそれが何であるか把握することはできません。django - イメージは保存されていません。他のすべてのフィールドは

** Btw私は複数の類似した投稿を読んだことがありますが、私は自分の問題に対処するとは思っていません。

form.py

class EditUserForm(forms.ModelForm): 
    template_name='/something/else' 

    class Meta: 
     model = User 
     fields = (
      'email', 
      'first_name', 
      'last_name', 
     ) 

class EditProfileForm(forms.ModelForm): 
    template_name='/something/else' 

    class Meta: 
     model = UserProfile 
     fields = (
      'description', 
      'city', 
      'website', 
      'phone', 
      'image', 

    ) 

views.py

@transaction.atomic 
def edit_profile(request): 
    if request.method == 'POST': 
     form = EditUserForm(request.POST, instance=request.user) 
     form2 = EditProfileForm(request.POST, instance=request.user.userprofile) 
     if form.is_valid() and form2.is_valid(): 
      form.save() 
      form2.save() 
      return redirect(reverse('accounts:view_profile')) 
    else: 
     form = EditUserForm(instance=request.user) 
     form2 = EditProfileForm(instance=request.user.userprofile) 
     args = {'form': form, 'form2':form2} 
     return render(request, 'accounts/edit_profile.html', args) 

models.py

class UserProfile(models.Model): 
    user = models.OneToOneField(User, on_delete=models.CASCADE) 
    description = models.CharField(max_length=100, default='') 
    city = models.CharField(max_length=100, default='') 
    website = models.URLField(default='') 
    phone = models.IntegerField(default=0) 
    image = models.ImageField(upload_to='profile_image', blank=True) 


    def __str__(self): 
     return self.user.username 

edit_profile.html

<div class="container"> 

    {% if form.errors %} 
    <ol> 
     {% for field in form %} 
     <H3 class="title"> 
     <p class="error"> {% if field.errors %}<li>{{ field.errors|striptags }}</li>{% endif %}</p> 
     </H3> 
     {% endfor %} 
    </ol> 
    {% endif %} 

    <form method="post" enctype="multipart/form-data"> 
     {% csrf_token %} 
     {{ form.as_p }} 
     {{ form2.as_p }} 
     <button type="submit">Submit</button> 
    </form> 
    <br> 
</div> 

答えて

3

ファイルをアップロードする場合は、フォームをrequest.POSTrequest.FILESでインスタンス化する必要があります。

form2 = EditProfileForm(request.POST, request.FILES, instance=request.user.userprofile) 

詳細はfile uploads上のドキュメントを参照してください。

+0

完璧、ありがとうございます! – MintDrop

+0

@MintDrop正しい答えを選択してください;) – hansTheFranz

関連する問題