저는 장고를 배우는 초보자입니다. 등록 양식을 작성할 때 문제가 있습니다. 이미지를 업로드 할 수 없습니다. 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
감사합니다.
안녕 라자! valid.py 인 경우 내부에서 views.py에 추가해야합니까? : 요청시 '사진'인 경우 : form.photo = request.FILES [ '사진'] form.save() – Dubliner
감사합니다. Raja, ve : request.FILES : form.photo = request.FILES [ 'photo'] user = ...와 user 사이에 '사진'이 추가되었습니다. 그러나 작동하지 않습니다. 어쩌면 나는 그것을 다른 장소에 놓아야 만한다 ... – Dubliner
아니, 나는 그것을 가지고 있지 않았다. 나 해보자. – Dubliner