Django - 如何在表单提交时添加用户的IP地址

5

我知道如果我在请求函数内部,可以使用ipware.ip的get_ip(request)或其他方法获取用户的IP地址,但是我正在使用(ListView, FormView)视图,所以我不确定如何像通常那样通过使用以下方式将IP添加到表单:

instance = form.save(commit=False)
instance.ip = get_ip(request)
instance.save()
2个回答

3

它给了我一个错误:NameError at /events/ 全局名称'request'未定义。 - user3439521
抱歉,您正在使用基于类的视图(CBV),我会修改我的答案 - 您需要使用 self.request - FlipperPA
它没有给我错误提示,但IP也没有被保存。我尝试在ipware的get_ip函数中添加self,它起作用了。from ipware.ip import get_ip instance = form.save(commit=False) instance.ip = get_ip(self.request) instance.save() - user3439521
嗯,如果你在一个类似于FormView的通用类视图中,这仍然让我感到困惑。但我很高兴它对你有用。 - FlipperPA

3
如果您无法访问self.request,这里有一种解决方法:
class SignUpForm(forms.ModelForm):
    fullname = forms.CharField(label="Full name", widget=forms.TextInput(attrs={'placeholder': 'Full name', 'class': 'form-control'}))
    class Meta:
        model = SignUps
        fields = ['eventname','fullname','ip']

    def __init__(self, *args, **kwargs):
        self.request = kwargs.pop('request', None) # Now you use self.request to access request object.
        super(SignUpForm, self).__init__(*args, **kwargs)

    def save(self, commit=True):
        instance =  super(SignUpForm, self).save(commit=False)
        instance.fullname = fullname
        instance.ip = get_ip(self.request)
        if commit:
            instance.save()
        return instance

http://brunobastos.net/how-to-access-the-httprequest-object-in-django-forms/


kwargs.pop('request', None) 在 Django 1.10 上对我返回了 None。我打印了 kwargs,发现它根本没有 request 对象。Django 1.10 有什么变化吗? - Anupam
1
在我学习之前,我花了一些时间才意识到我们需要从视图中传递请求对象以便表单可以访问它。所以在views.py中,mysignupform = SignUpForm(request.POST, request=request)。参见此链接 - Anupam

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