javascript - 当我尝试从表单更新时出现白色错误屏幕

标签 javascript python html css django

当我尝试通过 python/django 中的表单添加元素时,出现白色错误屏幕。我正在尝试调试它,但没有任何信息。有人能指出我正确的方向吗? enter image description here

模型.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.methodGET,您将创建未绑定(bind)的空表单(或使用一些初始 值)。然后,您返回带有此表单的模板,以便用户填写。
  • 如果您的request.methodPOST,您将创建绑定(bind)表单并检查它是否有效。
    • 如果有效,您保存并重定向。
    • 如果无效,您还返回带有绑定(bind)表单的模板(与 GET 情况相同)。现在,您的模板会显示包含用户之前填写的值和错误的表单,以便用户可以更正错误并重试。

关于javascript - 当我尝试从表单更新时出现白色错误屏幕,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53484630/

相关文章:

python - 将变量附加到应用程序与 Flask 中的 current_app 相同吗?

html - 将图像 float 在文本和段落的左侧,同时保持一切响应

html - 用图像填充父级高度的 div 样式高度

javascript - 使用 ng-click 链接 angular js 的事件类?

javascript - HTML5 游戏通过按下按钮移动 Sprite

javascript - CSS 不使用嵌套的类名规则

javascript - 使用 JQuery 淡入 JSON ajax 列表

javascript - 选择列并在 amcharts 中突出显示它们

python - PyHook 未检测到某些窗口中按下的键

python - Python 中的优化点积