当我尝试通过 python/django 中的表单添加元素时,出现白色错误屏幕。我正在尝试调试它,但没有任何信息。有人能指出我正确的方向吗?
模型.py
from __future__ import unicode_literals
from django.db import models
# Create your models here.
from django.contrib.auth.models import User
from django.db.models.signals import post_save
from django.dispatch import receiver
from django.utils import timezone
# Create your models here.
class UserProfile(models.Model):
image = models.ImageField(upload_to='images', default='Upload Picture')
user = models.OneToOneField(User, on_delete=models.CASCADE, related_name="profile")
first_name = models.CharField(max_length=255, blank=True)
last_name = models.CharField(max_length=255, blank=True)
address1 = models.CharField(max_length=255, blank=True)
address2 = models.CharField(max_length=255, blank=True)
city = models.CharField(max_length=20, null=True)
county = models.CharField(max_length=100, null=True)
postcode = models.CharField(max_length=7, null=True)
biography = models.TextField(max_length=280,blank=True)
email = models.CharField(max_length=50, blank=True, null=True)
phone = models.CharField(max_length=10, blank=True)
dob = models.CharField(max_length=10, blank=True)
gender = models.CharField(max_length=1, blank=True)
facebook = models.CharField(max_length=50, blank=True, null=True)
twitter = models.CharField(max_length=50, blank=True, null=True)
instagram = models.CharField(max_length=50, blank=True, null=True)
class KidProfile(models.Model):
parent = models.ForeignKey(User, related_name='kids')
name = models.CharField(max_length=255, null=True, blank=True)
dob = models.CharField(max_length=10, null=True, blank=True)
gender = models.CharField(max_length=1, null=True, blank=True)
needs = models.CharField(max_length=3, null=True, blank=True)
def __str__ (self):
return self.name
View .py
from django.contrib import messages, auth
from accounts.forms import UserRegistrationForm, UserLoginForm, FullUserDetailsForm, KidDetailsForm
from django.core.urlresolvers import reverse
from django.shortcuts import render, redirect, HttpResponseRedirect, HttpResponse, get_object_or_404
from django.template.context_processors import csrf
from django.contrib.auth.decorators import login_required
from .models import KidProfile, UserProfile
@login_required(login_url='/accounts/login')
def profile(request):
kids = KidProfile.objects.filter(parent=request.user)
adults = UserProfile.objects.filter(user=request.user)
return render(request, 'profile.html', {'kids': kids}, {'adults': adults})
def update_profile(request):
form=FullUserDetailsForm(request.POST, request.FILES)
if form.is_valid():
request.user.first_name=form.cleaned_data['first_name']
request.user.last_name=form.cleaned_data['last_name']
request.user.email=form.cleaned_data['email']
request.user.profile.address1=form.cleaned_data['address1']
request.user.profile.address2=form.cleaned_data['address2']
request.user.profile.postcode=form.cleaned_data['postcode']
request.user.profile.phone=form.cleaned_data['phone']
request.user.profile.dob=form.cleaned_data['dob']
request.user.profile.gender=form.cleaned_data['gender']
request.user.profile.facebook=form.cleaned_data['facebook']
request.user.profile.twitter=form.cleaned_data['twitter']
request.user.profile.instagram=form.cleaned_data['instagram']
request.user.save()
return redirect(reverse('profile'))
else:
return HttpResponse("Error")
def update_profile_kid(request, id):
kid = get_object_or_404(KidProfile, pk=id)
form=KidDetailsForm(request.POST, request.FILES)
if form.is_valid():
kid.name=form.cleaned_data['name']
kid.dob=form.cleaned_data['dob']
kid.gender=form.cleaned_data['gender']
kid.needs=form.cleaned_data['needs']
kid.save()
return redirect(reverse('profile'))
else:
return HttpResponse("Error")
def create_profile_kid(request):
form=KidDetailsForm(request.POST, request.FILES)
if form.is_valid():
kid=KidProfile()
kid.name=form.cleaned_data['name']
kid.dob=form.cleaned_data['dob']
kid.gender=form.cleaned_data['gender']
kid.needs=form.cleaned_data['needs']
kid.parent=request.user
kid.save()
return redirect(reverse('profile'))
else:
return HttpResponse("Error")
def delete_profile_kid(request, id):
kid = get_object_or_404(KidProfile, pk=id)
kid.delete()
return redirect(reverse('profile'))
def login(request):
if request.method == 'POST':
form = UserLoginForm(request.POST)
if form.is_valid():
user = auth.authenticate(username=request.POST.get('username_or_email'),
password=request.POST.get('password'))
if user is not None:
auth.login(request, user)
messages.error(request, "You have successfully logged in")
if request.GET and request.GET['next'] !='':
next = request.GET['next']
return HttpResponseRedirect(next)
else:
return redirect(reverse('babysitters'))
else:
form.add_error(None, "Your username or password was not recognised")
else:
form = UserLoginForm()
args = {'form': form, 'next': request.GET['next'] if request.GET and 'next' in request.GET else ''}
args.update(csrf(request))
return render(request, 'login.html', args)
def logout(request):
auth.logout(request)
messages.success(request, 'You have successfully logged out')
return redirect(reverse('index'))
def register(request):
if request.method == 'POST':
form = UserRegistrationForm(request.POST)
if form.is_valid():
form.save()
user = auth.authenticate(username=request.POST.get('username'),
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, "unable to log you in at this time!")
else:
form = UserRegistrationForm()
args = {'form': form}
return render(request, 'profile.html', args)
网址.py
from django.conf.urls import url
from .views import register, profile, logout, login, update_profile, update_profile_kid, create_profile_kid, delete_profile_kid
urlpatterns = [
url(r'^register/$', register, name='register'),
url(r'^profile/$', profile, name='profile'),
url(r'^profile/update/$', update_profile, name='update_profile'),
url(r'^profile/kids/update/(?P<id>\d+)$', update_profile_kid, name='update_profile_kid'),
url(r'^profile/kids/delete/(?P<id>\d+)$', delete_profile_kid, name='delete_profile_kid'),
url(r'^profile/kids/create/$', create_profile_kid, name='create_profile_kid'),
url(r'^logout/$', logout, name='logout'),
url(r'^login', login, name='login'),
]
我正在尝试调试问题,但到目前为止我还没有成功。有人可以帮助我或指出正确的方向。
最佳答案
在某些情况下,您的 View 仅返回字符串“Error”而没有任何信息。这就是您所看到的。
您永远不应该return HttpResponse("Error")
,因为这只会向浏览器返回一个包含文本“Error”的文档。
当您的表单无效时,您应该只返回包含绑定(bind)的无效表单的同一页面,并向用户显示表单错误。
阅读Forms documentation尤其是如何创建一个 View 来正确处理表单的三种状态(未绑定(bind)、绑定(bind)无效和绑定(bind)有效)。
一般来说,一个 View 应该这样处理:
- 如果您的
request.method
是GET
,您将创建未绑定(bind)的空表单(或使用一些初始
值)。然后,您返回带有此表单的模板,以便用户填写。 - 如果您的
request.method
是POST
,您将创建绑定(bind)表单并检查它是否有效。- 如果有效,您保存并重定向。
- 如果无效,您还返回带有绑定(bind)表单的模板(与
GET
情况相同)。现在,您的模板会显示包含用户之前填写的值和错误的表单,以便用户可以更正错误并重试。
关于javascript - 当我尝试从表单更新时出现白色错误屏幕,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53484630/