gpt4 book ai didi

django - 如何创建不允许编辑某些字段的自定义 UserChangeForm?

转载 作者:行者123 更新时间:2023-12-02 05:13:39 25 4
gpt4 key购买 nike

这是我关于 SO 的第二篇文章,也是我关于 Django 的第二篇文章——请保持温柔。

我正在研究一个简单的用户模型。用户应该能够注册该网站,并且注册后他们应该能够在登录时更改其帐户设置。但是,如果我执行以下操作,用户会看到一个巨大的表单,其中包含我不希望他们编辑的各种信息:

views.py

from django.shortcuts import render_to_response, get_object_or_404
from django.core import urlresolvers
from django.http import HttpResponseRedirect
from django.template import RequestContext
from django.contrib.auth.decorators import login_required
from django.contrib.auth.forms import UserChangeForm

@login_required
def settings( request, template_name = 'accounts/settings.html' ):
"""
Processes requests for the settings page, where users
can edit their profiles.
"""
page_title = 'Account Settings'
if request.method == 'POST':
postdata = request.POST.copy()
form = UserChangeForm( postdata )
if form.is_valid():
form.save()
else:
form = UserChangeForm()
title = 'Settings'
return render_to_response( template_name, locals(), context_instance = RequestContext( request) )

好像这还不够糟糕,此表单不允许进行任何更改,并引用“具有此用户名的用户已存在”作为错误。这让我很困惑——我正在尝试保存 UserChangeForm,那么它不是已经存在了吗?

我已经在网上查找了一段时间,尝试根据 other questions 制作自己的自定义表单。我在 SO 上见过,就像这样:

forms.py

class CustomUserChangeForm( UserChangeForm ):
def __init__( self, *args, **kwargs ):
super( CustomUserChangeForm, self ).__init__( *args, **kwargs )
if self.instance and self.instance.pk:
# Since the pk is set this is not a new instance
self.fields['username'] = self.instance.username
self.fields['username'].widgets.attrs['readonly'] = True

不幸的是,这并没有成功。我有点不知道该怎么做,所以任何帮助将不胜感激。以下是我的 urls.py 和模板:

urls.py

urlpatterns = patterns('appname.accounts.views',

url(r'^settings/$', 'settings', {
'template_name': 'accounts/settings.html'
}, 'settings'
),
)

模板

{% extends "accounts/base.html" %}

{% block main %}
<h1>Welcome, {{ request.user.pk }}{{ request.user.username }} to accounts.templates.accounts.settings.html.</h1>
<h2>Here you can update your user settings. You can change your password <a href="{% url change_password %}">here</a>.</h2>
<form action="." method="post" accept-charset="utf-8">
{% csrf_token %}
{{ form.as_p }}
<p><input type="submit" value="Update &rarr;"></p>
</form>
{% endblock %}

预先感谢您的帮助!

最佳答案

首先:要限制表单中的字段,请遵循 documentation 。过滤字段基本上有两个选项:fieldsexclude

第二:你总是在创建一个新用户。使用 User 实例初始化表单,您不仅能够保存表单,而且还将拥有一个初始数据集。

您的查看代码应为:

# in the POST:
form = UserChangeForm(request.POST, instance=request.user)

# otherwise
form = UserChangeForm(instance=request.user)

并从 form.py 中删除赋值。

关于django - 如何创建不允许编辑某些字段的自定义 UserChangeForm?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5521273/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com