2016-07-24 2 views
0

저는 장고를 배우는 초보자입니다. 등록 양식을 작성할 때 문제가 있습니다. 이미지를 업로드 할 수 없습니다. 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

안녕 라자! valid.py 인 경우 내부에서 views.py에 추가해야합니까? : 요청시 '사진'인 경우 : form.photo = request.FILES [ '사진'] form.save() – Dubliner

+0

감사합니다. Raja, ve : request.FILES : form.photo = request.FILES [ 'photo'] user = ...와 user 사이에 '사진'이 추가되었습니다. 그러나 작동하지 않습니다. 어쩌면 나는 그것을 다른 장소에 놓아야 만한다 ... – Dubliner

+0

아니, 나는 그것을 가지고 있지 않았다. 나 해보자. – Dubliner

답변

0

당신은 폼 클래스

form = UserRegistrationForm(request.POST) 

에 request.FILES을 추가해야합니다 또한 form.photo = request.FILES['photo']

+0

은'form.photo'입니까? –

+0

예. 내 실수. 지금 업데이트 됨 ... –

관련 문제