【问题标题】:Django 1.9 forms not displaying in template but CSRF token isDjango 1.9 表单未显示在模板中,但 CSRF 令牌是
【发布时间】:2016-12-06 14:13:17
【问题描述】:

我正在处理一个 Django 项目,但在我的模板中呈现模型表单时遇到问题。我已经阅读了through the documentation,教程以及在这里搜索;特别是这个帖子有人had with their input fields not showing。我认为我的问题是相似的,但我仍然没有任何成功。基本上,当我调用{{ form.as_p }} 时,DOM 中没有显示任何内容。尽管我的 csrf 令牌工作,但仍会发生这种情况。这是我的模型的代码:

class Workout(models.Model):
upper_body = models.CharField(max_length=30, help_text="ex: Bench Press, Shoulder Press, Shrugs")
lower_body = models.CharField(max_length=30, help_text="Squats, Lunges, Deadlifts")
explosive = models.CharField(max_length=30, help_text="Hang Cleans, Box Jumps, Hang Snatch")
cardio = models.CharField(max_length=30, help_text="Jogging, Cycling, 110s")
speed = models.CharField(max_length=30, help_text="Sprints, 10 yard starts, Speed Sled")
skill = models.CharField(max_length=30, help_text="Boxing, Jump Shooting, Route Running")
athlete = models.ForeignKey(User, related_name='athlete')

def __unicode__(self):
    return u"{}".format(self.athlete)

这是该模型的forms.py

from django import forms
from .models import User, Workout, Meal
from django.forms import ModelForm

# Beginning of Workout Form

class WorkoutForm(forms.ModelForm):
    class Meta:
        model = Workout
        fields = ["upper_body",
                  "lower_body",
                  "explosive",
                  "cardio",
                  "speed",
                  "skill"]

# End of Workout Form

这是我的views.py 表单:

from .models import User, Workout, Meal
from Spartan.forms import UserForm, WorkoutForm, MealForm
from django.shortcuts import render, redirect
from django.http import HttpResponse, HttpResponseForbidden, HttpResponseRedirect

def workout_form(request):
    form = WorkoutForm(request.POST or None)
    if form.is_valid():
        workout = form.save(commit=False)
        workout.athlete = request.user
        workout.save()
        return redirect('user/workouts.html')

这是应该在模板上呈现的实际表单:

<div class="container">
    <h3>Create your workout</h3>
    <form method="POST" action=".">
        {% csrf_token %}

        {{ form.as_p }}

    <button class="btn btn-primary" type="submit" value="Create Your Workout">CREATE WORKOUT</button>
    </form>
</div>

正如我所说,令牌在那里,连同表单和按钮,只是没有输入字段。如果有人可以帮助我指出我没有做什么或我忽略了什么,将不胜感激。

谢谢!

【问题讨论】:

  • 在视图的else部分,添加括号,构造表单对象-form = WorkoutForm()
  • @JRodDynamite 的建议应该可以解决问题,但您实际上根本不需要 else 块。你已经在做form = WorkoutForm(request.POST or None),它为 POST 和 GET 请求创建了一个表单。
  • @Alasdair - 是的,你是对的。没注意到。因此,只需删除 else 块即可解决 OP 的问题。
  • 感谢@Alasdair 和@JRodDynamite 我删除了else 块,它仍然没有渲染。
  • 除了else 块之外,我无法在您的代码中发现任何问题。希望你能解决问题。

标签: django forms django-1.9


【解决方案1】:

问题在你看来。 else 块无关紧要,因为在您的 GET 请求中,is_valid 总是返回 False,而您正在重定向到 user/workouts.html没有上下文

一种解决方案是使用 if/else 语句来分割处理 GET 和 POST 的方式:

def workout_form(request):
    form = WorkoutForm() # Will be overridden if `is_valid` returns `False`
    if request.method == "POST":
        form = WorkoutForm(data=request.POST)
        if form.is_valid():
            workout = form.save(commit=False)
            workout.athlete = request.user
            workout.save()
            return redirect('user/workouts.html')

    return render(request, 'user/workouts.html',
              {'form': form})

【讨论】:

  • 我刚刚尝试了if/else 语句,但表单仍未呈现。令人沮丧。我试过你上面的例子。考虑下一步尝试使用上下文重定向。
  • @Long_Live_King 您无法在 Django 中使用上下文进行重定向。您是否在代码中放置了调试器?如果您使用我在示例中给出的确切代码,return render(request..... 上方的form 的值是多少 - 当您尝试获取空白表单时,您还应该确认is_valid 正在返回False。是这样吗?
  • 我尝试了您拥有的代码,并收到了 POST 的 200 个请求(一直是这种情况)以及 GET 的 304 个请求。我还没有尝试过调试器。
  • import pdb; pdb.set_trace() 放在return render... 之前,并确保您的form 对象实际上包含一个空表单。然后确保您已更改回使用 form.as_pworkout_form.as_p 每个 cmets。
  • 抱歉耽搁了回复。使用pdb.set_trace() 时继续收到 200 请求。现在尝试基于类的视图,看看是否可行。
【解决方案2】:

想通了。我犯了一个愚蠢的错误。基本上在我设置样式时为正在渲染的页面编写了一个视图。完全忘记了它被调用了,workout_form 的函数甚至没有被使用。这也是为什么pdb.set_trace() 也没有运行的原因。现在一切都很好。感谢所有提供帮助的人。

【讨论】:

    猜你喜欢
    • 2016-06-22
    • 2012-03-25
    • 2018-04-07
    • 2016-02-24
    • 2014-08-12
    • 2014-10-24
    • 2019-03-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多