Django隐藏字段未保存到数据库

时间:2017-12-11 18:14:21

标签: python django

我正在尝试在扩展配置文件模型中保存用户的IP地址。目标是使这成为一个隐藏的领域。目前,我可以通过将IP地址打印到控制台来进行调试。当我尝试保存信息时会出现问题。

views.py

autoplay=4s
autoplay=4&amp
autoplay=4s&amp

forms.py

def index(request):
    #request.session.flush()
    if request.user.is_authenticated:
        return redirect('ve:dashboard')
    elif request.method == 'POST':
        form = RegistrationForm(request.POST)

        if form.is_valid():
            user = form.save(commit=False)
            user.refresh_from_db() # Load the profile instance created by the Signal
            user.profile.birth_date = form.cleaned_data.get('birth_date')
            user.ipaddress = get_ip(request)
            print(user.ipaddress)
            user.save()
            raw_password = form.cleaned_data.get('password1')
            user = authenticate(username=user.username, password=raw_password)
            login(request, user)
            return redirect('ve:dashboard')
    else:
        form = RegistrationForm()
    return render(request, 'index.html', {'form': form})

的index.html

class RegistrationForm(UserCreationForm):
    # birth_date = forms.DateField(help_text='Required. Format: YYYY-MM-DD')
    birth_date = forms.DateField(widget=SelectDateWidget(years=range(1999, 1910, -1)))
    #ipaddress = forms.IntegerField(widget=forms.HiddenInput(), required=False)

    class Meta:
        model = User
        fields = ('username', 'email', 'birth_date', 'password1', 'password2',)
        exclude = ['ipaddress',]

models.py

    <form method="post">
    {% csrf_token %}
    {% for field in form %}
        <p class="text-left">
        {{ field.label_tag }}<br>
        {{ field }}
        {% for error in field.errors %}
          <p style="color: red">{{ error }}</p>
        {% endfor %}
        </p>
    {% endfor %}
    <button type="submit">Sign up</button>
    </form>

在我尝试添加ipaddress字段之前,此表单正常工作。我一直在尝试多个版本,有时表单会创建一个新用户,但ipaddress不会保存..

上面的当前代码让我在POST时出错: /NotExist at / User匹配查询不存在。由于这一行&#34; user.refresh_from_db()#加载由Signal&#34;

创建的配置文件实例

1 个答案:

答案 0 :(得分:2)

来自文档:

  

此save()方法接受可选的commit关键字参数,该参数接受True或False。如果使用commit = False调用save(),则它将返回尚未保存到数据库的对象。

因此,由于您正在以[{1}}方式传递提交,因此您将获得未保存的实例。尝试在数据库中实际存在的对象上调用False将失败,因为它显然正在执行。如果模型的实例没有refresh_from_db,则id在调用它时将失败。

至于继续无法保存IP地址,我注意到您的表单元素已将模型设置为refresh_from_db对象。默认的Django User对象没有ip地址。我看到你在链接的模型文件中有一个User模型,它有一个IP地址,所以在这种情况下,我认为你的表单设置错误了。或者您需要以不同方式处理请求。

表单更改

目前,您的表单正在尝试创建/修改Django Profile模型。除非您制作了自己未展示的自定义User模型,否则此用户模型在数据库中不会有User字段,即使您设置了{{1}然后保存用户,ip地址不会在当前范围之外持久存在,因为您所做的就是为ipaddress实例声明一个新变量。

如果您将表单更改为指向user.ipaddress = <address>模型,则可以使用user保存地址并成功保存。但是您必须更新模板,因为默认情况下它只会显示您的个人资料的字段,而不会显示与之关联的用户对象。

更改模板/视图

您还可以更改模板和视图以适应它。显然,您的视图可以使用Profile函数生成IP地址,因此暂时我假设您的模板正常,因此需要进行的唯一更改是您的视图。 / p>

目前,您的视图在调用profile.ipaddress = <address>时会返回未保存的get_ip实例。这意味着您需要保存用户,然后创建一个User模型,并使用您的IP地址引用它。

form.save