Django - 注册表格无法上传图片

时间:2016-07-24 12:28:52

标签: python django forms

我是Django的初学者。我填写注册表时遇到问题。我无法上传任何图片。 如果ImageField设置为required=true,则它永远不会被验证,无法提交。 如果required=false,则可以提交,但图片永远不会保存在目标文件夹(模型)中。 但是,我可以作为超级用户从管理面板上传图像。

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

感谢。

2 个答案:

答案 0 :(得分:0)

您必须在表单类

中添加request.FILES
form = UserRegistrationForm(request.POST)

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

答案 1 :(得分:0)

我认为也许您忘记将enctype="multipart/form-data"添加到表单中。