Django表示字段没有显示

时间:2016-07-12 15:48:28

标签: django forms field

我是django的新手并试图在html文件中显示表单,当我在浏览器上访问此特定页面时,我看不到字段。有谁知道为什么?

这是html文件:我可以看到除表单外的所有内容 add_device.html

{% extends 'layout/layout1.html' %}
{% block content %}
    <form action = "userprofile/" method = "post">
        {% csrf_token %}
        {{ form }}
        <input type = "submit" value = "Submit"/>
    </form>
{% endblock %}

forms.py

from django import forms
from models import UserProfile

class UserProfileForm(forms.ModelForm):
    class Meta:
        model = UserProfile
        fields = ('deviceNb',)

models.py

from django.db import models
from django.contrib.auth.models import User


class UserProfile(models.Model):
    user = models.OneToOneField(User)
    deviceNb = models.CharField(max_length = 100)

User.profile = property(lambda u : UserProfile.objects.get_or_create(user = u)[0])

views.py

def user_profile(request):
    if request.method == 'POST':
        #we want to populate the form with the original instance of the profile model and insert POST info on top of it
        form = UserProfileForm(request.POST, instance=request.user.profile)

        if form.is_valid:
            form.save()
            #to go back to check that the info has changed
            return HttpResponseRedirect('/accounts/loggedin')

        else:
            #this is the preferred way to get a users info, it is stored that way
            user = request.user
            profile = user.profile
            #if we have a user that has already selected info, it will pass in this info
            form = UserProfileForm(instance=profile)

        args = {}
        args.update(csrf(request))
        args['form'] = form

        print(form)

        return render_to_response('profile.html',args)

我很确定我的url文件没问题,因为我找到了正确的网址,我的问题实际上是表单字段没有显示出来。

非常感谢!!

3 个答案:

答案 0 :(得分:2)

您未在视图中处理GET请求。将视图的代码更新为

def user_profile(request):
    if request.method == 'POST':
     # your existing code
     # .....
    else : #when its get request
        form = UserProfileForm(instance=request.user.profile)
        args = {}
        args.update(csrf(request))
        args['form'] = form

        return render_to_response('profile.html',args)

这是一个示例代码,可以进行改进。

答案 1 :(得分:2)

您的观点缩进不正确。 else块属于if request.method == 'POST'语句,并处理GET请求。

您还需要修复方法末尾的缩进,以便返回get和post请求的响应。最好使用render而不是过时的render_to_response。这简化了您的代码,因为您不再需要调用args.update(csrf(request))

from django.shortcuts import render

def user_profile(request):
    if request.method == 'POST':
        #we want to populate the form with the original instance of the profile model and insert POST info on top of it
        form = UserProfileForm(request.POST, instance=request.user.profile)

        if form.is_valid:
            form.save()
            #to go back to check that the info has changed
            return HttpResponseRedirect('/accounts/loggedin')

    else:
        #this is the preferred way to get a users info, it is stored that way
        user = request.user
        profile = user.profile
        #if we have a user that has already selected info, it will pass in this info
        form = UserProfileForm(instance=profile)

    args = {}
    args['form'] = form

    return render(request, 'profile.html', args)

答案 2 :(得分:1)

您也应该处理GET请求。请在您的视图中尝试此操作:

def user_profile(request):
    form = UserProfileForm()
    if request.method == 'GET':
        # handle GET request here
        form = UserProfileForm(instance=request.user.profile)

    elif request.method == 'POST':
        #we want to populate the form with the original instance of the profile model and insert POST info on top of it
        form = UserProfileForm(request.POST, instance=request.user.profile)
        if form.is_valid:
            form.save()
            #to go back to check that the info has changed
            return HttpResponseRedirect('/accounts/loggedin')
    args = {}
    args['form'] = form
    return render_to_response('profile.html',args)

在您的profile.html中,您可以执行以下操作:

{{ form.as_p }}