私は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
ありがとうございました。
こんにちはラジャをrequest.FILESを追加する必要があります!検証する場合はviews.pyに追加する必要があります:要求に「写真」が含まれている場合:ファイル: form.photo = [写真] form.save() – Dubliner
ありがとうRaja、これをviews.pyに追加しました:リクエストの中の '写真'の場合。ファイル:form.photo = request.FILES [写真] =ユーザーとユーザーの間。ただし、動作しません。たぶん私は別の場所に置く必要があります... – Dubliner
いいえ私はそれを持っていませんでした。私が試してみましょう。 – Dubliner