2016-12-15 89 views
0

我正在尝试创建一个“编辑配置文件”页面/表单,并且遵循SimpleIsBetterThanComplex教程,介绍如何通过OneToOne链接扩展用户模型。但是,当我尝试显示用户配置文件表单以允许用户更新他们的配置文件时,表单根本不显示,除了提交按钮...任何想法,我可能在这里出错了?Django表单不能以模板显示

models.py

from __future__ import unicode_literals 
from django.db import models 
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 

class Profile(models.Model): 
    user = models.OneToOneField(User, on_delete=models.CASCADE) 

    #account types 
    is_userA = models.BooleanField('User A', default=True) 
    is_userB = models.BooleanField('User B', default=False) 
    is_superuser = models.BooleanField('SuperUser', default=False) 

    #other fields here 
    avatar = models.ImageField('avatar', upload_to='static/media/images/avatars/', null=True, blank=True) 
    phone = models.CharField('phone number', max_length=20, blank=True, default='') 
    address = models.CharField('address', max_length=100, default='', blank=True) 
    city = models.CharField('city', max_length=100, default='', blank=True) 
    state = models.CharField('state', max_length=2, default='', blank=True) 
    country = models.CharField('country', max_length=100, default='', blank=True) 
    date_joined = models.DateTimeField(default=timezone.now) 

    @receiver(post_save, sender=User) 
    def create_user_profile(sender, instance, created, **kwargs): 
     if created: 
      Profile.objects.create(user=instance) 

    @receiver(post_save, sender=User) 
    def save_user_profile(sender, instance, **kwargs): 
     instance.profile.save() 

forms.py

class UserForm(forms.ModelForm): 
    class Meta: 
     model = User 
     fields = ('first_name', 'last_name', 'email') 

views.py

@login_required 
@transaction.atomic 
def update_profile(request): 
    if request.method == 'POST': 
     user_form = UserForm(request.POST, instance=request.user) 
     if user_form.is_valid(): 
      user_form.save() 
      messages.success(request, _('Your profile was successfully updated!')) 
      return redirect('settings:profile') 
     else: 
      messages.error(request, _('Please correct the error below.')) 
    else: 
     user_form = UserForm(instance=request.user) 
    return render(request, 'profiles/profile.html', { 
     'user_form': user_form, 
    }) 

模板

<div class="col-md-12"> 
    <div class="mb32"> 
    <h5 class="uppercase">General Information</h5> 
    </div> 
    <div class="row"> 
    <form method="post"> 
    {% csrf_token %} 
    {{ user_form.as_p }} 
    <button type="submit">Save changes</button> 
    </form> 
+0

显示您的模板 –

+0

@ZagorodniyOlexiy将模板代码添加到原始文章 – Nick

+0

您的意思是表单没有呈现,或者您可以看到名字,姓氏和电子邮件字段,并且没有看到配置文件的字段,如头像,手机等? – neverwalkaloner

回答

0

你的观点寻找现在看起来是这样的: views.py

@login_required 
@transaction.atomic 
def update_profile(request): 
    if request.method == 'POST': 
     user_form = UserForm(request.POST, instance=request.user) 
     if user_form.is_valid(): 
      user_form.save() 
      messages.success(request, _('Your profile was successfully updated!')) 
      return redirect('settings:profile') 
     else: 
      messages.error(request, _('Please correct the error below.')) 
    else: 
     user_form = UserForm(instance=request.user) 
    return render(request, 'profiles/profile.html', { 
     'user_form': user_form, 
    }) 

根据这个观点,如果POST方法,您从表单验证照耀处的数据,但是当它的GET方法,你只是定义UserForm,所以我认为你必须在最后一行缩进: views.py

@login_required 
@transaction.atomic 
def update_profile(request): 
    if request.method == 'POST': 
     user_form = UserForm(request.POST, instance=request.user) 
     if user_form.is_valid(): 
      user_form.save() 
      messages.success(request, _('Your profile was successfully updated!')) 
      return redirect('settings:profile') 
     else: 
      messages.error(request, _('Please correct the error below.')) 
    else: 
     user_form = UserForm(instance=request.user) 
     return render(request, 'profiles/profile.html', { 
     'user_form': user_form, 
    }) 

因此,您的最后一行return render(request, 'profiles/profile.html', {'user_form': user_form,})必须在else声明之下,据我了解,导致其GET