2016-07-24 8 views
0

私はDjangoの初心者です。私は登録用紙に記入する際に問題があります。画像をアップロードできません。 ImageFieldがrequired=trueに設定されていると、決して妥当性検査されず、送信できません。 required=falseの場合、画像を送信することはできますが、画像は保存先フォルダ(モデル)に保存されません。 しかし、スーパーユーザーとして管理パネルから画像をアップロードできます。Django - 登録フォームは画像をアップロードできません

MODELS.PY 

from __future__ import unicode_literals 
from django.contrib.auth.models import AbstractUser, UserManager 
from django.db import models 
from django.utils import timezone 

class AccountUserManager(UserManager): 
    def _create_user(self, username, email, password, 
        is_staff, is_superuser, **extra_fields): 

     now = timezone.now() 
     if not email: 
      raise ValueError('The given username must be set') 

     email = self.normalize_email(email) 
     user = self.model(username=email, email=email, 
          is_staff=is_staff, is_active=True, 
          is_superuser=is_superuser, 
          date_joined=now, **extra_fields) 
     user.set_password(password) 
     user.save(using=self._db) 

     return user 

class User(AbstractUser): 

    """ 
    Here goes a little code for stripe, but I removed it for making it shorter. 
    """ 
    team = models.CharField(max_length=20, default='') 
    photo = models.ImageField('photo', upload_to='static/media/profiles/', null=True, blank=True) 

    objects = AccountUserManager() 

views.py

VIEWS.PY 

from django.contrib import messages, auth 
from django.contrib.auth.decorators import login_required 

from accounts.forms import UserRegistrationForm, UserLoginForm 
from django.core.urlresolvers import reverse 
from django.shortcuts import render, redirect, get_object_or_404 
from django.template.context_processors import csrf 
from django.conf import settings 
import datetime 
from django.views.decorators.csrf import csrf_exempt 
from django.http import HttpResponse 
from models import User 
import stripe 
import arrow 
import json 
from django.http import Http404, HttpResponseRedirect 

from forms import UpdateProfileForm 


stripe.api_key = settings.STRIPE_SECRET 


def register(request): 
    if request.method == 'POST': 
     form = UserRegistrationForm(request.POST) 
     if form.is_valid(): 
      try: 
       customer = stripe.Customer.create(

        email=form.cleaned_data['email'], 
        card=form.cleaned_data['stripe_id'], 
        plan='REG_MONTHLY', 
       ) 
      except stripe.error.CardError, e: 
       messages.error(request, "Your card was declined!") 

      if customer: 
       user = form.save() 
       user.stripe_id = customer.id 
       user.subscription_end = arrow.now().replace(weeks=+4).datetime 
       user.save() 

       user = auth.authenticate(email=request.POST.get('email'), password=request.POST.get('password1')) 

       if user: 
        auth.login(request, user) 
        messages.success(request, "You have successfully registered") 
        return redirect(reverse('profile')) 

       else: 
        messages.error(request, "We were unable to log you in at this time") 
      else: 
       messages.error(request, "We were unable to take payment from the card provided") 
    else: 
     today = datetime.date.today() 
     form = UserRegistrationForm(initial={'expiry_month': today.month, 'expiry_year': today.year}) 

    args = {'form': form, 'publishable': settings.STRIPE_PUBLISHABLE} 
    args.update(csrf(request)) 
    return render(request, 'register.html', args) 
... 

そしてここではforms.py来る:

FORMS.PY 

from django import forms 
from django.contrib.auth.forms import UserCreationForm 
from accounts.models import User 
from django.core.exceptions import ValidationError 


class UserRegistrationForm(UserCreationForm): 
    """More fields for stripe""" 
    photo = forms.ImageField(label='Photo', required=False) 
    team = forms.CharField(label='team') 

    password1 = forms.CharField(
     label='Password', 
     widget=forms.PasswordInput 
    ) 

    password2 = forms.CharField(
     label='Password confirmation', 
     widget=forms.PasswordInput 
    ) 

    class Meta: 
     model = User 
     fields = ['email', 'password1', 'password2', 'team', 'photo'] 
     exclude = ['username'] 

    def clean_password2(self): 
     password1 = self.cleaned_data.get('password1') 
     password2 = self.cleaned_data.get('password2') 

     if password1 and password2 and password1 != password2: 
      message = "Passwords do not match" 
      raise forms.ValidationError(message) 

     return password2 

    def clean_email(self): 
     email = self.cleaned_data.get('email') 

     if not email: 
      message = "Please enter your email address" 
      raise forms.ValidationError(message) 

     return email 


    def save(self, commit=True): 
     instance = super(UserRegistrationForm, self).save(commit=False) 

     # automatically set to email address to create a unique identifier 
     instance.username = instance.email 

     if commit: 
      instance.save() 

     return instance 
... 

は多分画像が保存されていません...私は迷ってしまいました。私は3日間ここで記事を読んできましたが、私は解決策を見いだせませんでした。私は鉱山と同様の問題を抱えていましたが、アプローチは異なりますが、まだ解決されていません。 Django: upload image to form

ありがとうございました。

+0

こんにちはラジャをrequest.FILESを追加する必要があります!検証する場合はviews.pyに追加する必要があります:要求に「写真」が含まれている場合:ファイル: form.photo = [写真] form.save() – Dubliner

+0

ありがとうRaja、これをviews.pyに追加しました:リクエストの中の '写真'の場合。ファイル:form.photo = request.FILES [写真] =ユーザーとユーザーの間。ただし、動作しません。たぶん私は別の場所に置く必要があります... – Dubliner

+0

いいえ私はそれを持っていませんでした。私が試してみましょう。 – Dubliner

答えて

0

あなたはフォームクラスで

form = UserRegistrationForm(request.POST) 

form.photo = request.FILES['photo']

+0

は 'form.photo'ですか? –

+0

うん。私の間違い。今更新されました... –

関連する問題