名称错误:在Django表单中,名称'request'未定义

6

我该如何在forms.py中获取当前已登录的用户? 我想要预填充当前用户的电子邮件字段。

class ContactMe(forms.Form):
    name                 = forms.CharField(label = "Name")
    email_address        = forms.CharField(label = "Email Address", intital = request.user.email)
    subject              = forms.CharField(label = "Subject")
    message              = forms.CharField(label = "Message", widget=forms.Textarea(attrs={'cols': 10, 'rows': 3}))
    additional_comments  = forms.CharField(required = False)
    class Meta:
        model = Contact_me

我尝试将来自 views.py 的请求传递为:

contact_form = ContactMe(request.POST or None, request)

然后在类ContactMe内接收请求,如下:

class ContactMe(forms.Form, request):
    name                 = forms.CharField(label = "Name")
    email_address        = forms.CharField(label = "Email Address", intital = **request.user.email**)
    subject              = forms.CharField(label = "Subject")
    message              = forms.CharField(label = "Message", widget=forms.Textarea(attrs={'cols': 10, 'rows': 3}))
    additional_comments  = forms.CharField(required = False)
    class Meta:
        model = Contact_me

它抛出错误 NameError: name 'request' is not defined。我知道在html, models.py, views.py中可以使用request。如何在forms.py中获取请求?

views.py

def list_posts(request):
    request.session.set_expiry(request.session.get_expiry_age())        # Renew session expire time
    instance_list = Post.objects.all()
    register_form = UserRegisterForm(data=request.POST or None)
    if register_form.is_valid():
        personal.views.register_form_validation(request, register_form)

    login_form = UserLoginForm(request.POST or None)
    if login_form.is_valid() :
        personal.views.login_form_validation(request, login_form)

    feedback_form = FeedbackForm(request.POST or None)
    if feedback_form.is_valid() :
        personal.views.feedback_form_validation(request, feedback_form)

    contact_form = ContactMe(request.POST or None, request)
    if contact_form.is_valid() :
    personal.views.contact_form_validation(request, login_form)

    if request.POST and not(register_form.is_valid() or login_form.is_valid()):
        if request.POST.get("login"):
            return accounts.views.login_view(request)
        else:
            return accounts.views.register_view(request)

    template = 'blog/archives.html'
    dictionary = {

        "object_list"   : content,
        "register_form" : register_form,
        "login_form"    : login_form,
        "feedback_form" : feedback_form,
        "contact_form"  : contact_form,
    }
    return render(request,template,dictionary)

你能展示一下你的观点吗? - Karolis Ryselis
@KarolisRyselis:在问题中添加了views.py - sagar_jeevan
这段代码位于哪里:contact_form = ContactMe(request.POST or None, request) - Karolis Ryselis
它位于 views.py 中。 - sagar_jeevan
3个回答

6
您正在构建表单类时尝试传递request,但此时还没有请求。请求仅存在于您的视图函数内部。因此,在构建表单实例时,应在视图函数中传递请求。要预填充表单,可以使用表单构造函数的initial关键字。它以字段名称和值的字典作为输入。
示例:
#views.py
from django.shortcuts import render
from django import forms

class TestForm(forms.Form):
    foo = forms.CharField()

def test_form(request):
    form = TestForm(initial=dict(foo=request.<some_property>))
    context = dict(form=form)
    template_name = 'testapp/test.html'
    return render(request, template_name, context)

这个描述帮了我很多,谢谢。 - Abbas

3

这一行是错误的:class ContactMe(forms.Form, request)

(提示: request 不是您表单的基类)

正确的方法是在表单的 __init__ 方法中访问 user

class ContactMe(forms.ModelForm):

    class Meta:
         model = Contact_me
         fields = '__all__'

    def __init__(self, *args, **kwargs):
        user = kwargs.pop('user', None)
        super(ContactMe, self).__init__(*args, **kwargs)

views.py 中相应的代码行:

contact_form = ContactMe(request.POST, user=request.user)

我添加了上述代码,但它显示 NameError: name 'ContactMe' is not defined。该类的名称为 ContactMe - sagar_jeevan
你确定缩进正确吗?我改变了示例,使用ModelForm来简化事情。 - arie
是的,缩进不对了。错误已经消失了。我目前已登录,但是 kwargsargs 显示为空的 {} - sagar_jeevan
你确定在实例化表单时传递了额外的参数 ContactMe(request.POST, user=request.user)(并且使用了正确的表单)吗? - arie
是的,我正在使用 contact_form = ContactMe(request.POST or None, user = request.user)。空的 kwargsargs。我想知道为什么! - sagar_jeevan
我一直尝试了这个...它仍然是空的!无论如何还是谢谢。 - sagar_jeevan

0

如果你写成了requests而不是request,也会出现这个错误。

例如:

在views.py中

def all_products(requests):
    products = Product.objects.all()
    return render(request, 'store/home.html', {'products': products})

应该是:

def all_products(request):
    products = Product.objects.all()
    return render(request, 'store/home.html', {'products': products})

这就是我的问题,所以我提出来。


将请求中的名称从request更改为requests,代码如下: return render(requests, 'store/home.html', {'products': products}) 希望这对您有用,就像对我一样。 - amaar

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接