2016-07-24 71 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

嗨拉贾!我应该添加views.py,如果验证内...:if'photo'in request.FILES: form.photo = request.FILES ['photo'] form.save() – Dubliner

+0

谢谢Raja,在views.py中添加了这个:如果request.FILES中的'photo':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

是的。我的错。现在更新... –