我被告知,在更新用户时,我应该使用Django表单而不是自己编写。因此,我转向了Django形式,但碰到了一点墙。
我的系统中的用户部分定义如下:
#models.py
class Freelancer(AbstractBaseUser):
email = models.EmailField(primary_key=True)
first_name = models.CharField(max_length=128)
surname = models.CharField(max_length=128)
university = models.CharField(max_length=256)
verified = models.BooleanField(default=False)
biography = models.TextField(default="")
skills = models.ManyToManyField(Skill)
created_date = models.DateTimeField(default=timezone.now)
USERNAME_FIELD = 'email'
我有一个网址:
#urls.py
url(r'^profile/$', views.Profile.as_view(), name="profile"),
观点:
#views.py
class Profile(UpdateView):
model = Freelancer
fields = ['email']
template_name_suffix = '_update_form'
问题是我需要告诉服务器我要更新的Freelancer。我尝试将(?P<pk>\d+)/
添加到URL正则表达式中,正如我在一些教程中看到的那样,但是当我传入自由职业者的ID时 - 在模式中自动创建 - 它不会检索自由职业者。根据我的模型,我该怎么办?
答案 0 :(得分:1)
我认为使用电子邮件地址作为主键是个坏主意。如果用户更改了他们的电子邮件地址该怎么办?
为电子邮件地址设置unique=True
可能更好一点,让Django创建自动主键。然后在您的网址中加入(?P<pk>\d+)/
即可。
如果您必须使用电子邮件作为主键,则需要将(?P<pk>\d+)/
的正则表达式更改为
(?P<pk>[\w@.-]+)
上述内容可能无法捕获所有电子邮件地址。我认为Django包含一个更好的角色类,但我现在无法找到它。
答案 1 :(得分:0)
我认为你只是以错误的方式做这件事。 以下是您需要做的事情:
首先,我建议您在模型中添加一个PK,因为将电子邮件作为pk
是一个坏主意。
url
一个例子:
url(r'^profile/(?P<pk>[\d]+)/edit/$',
views.ProfileUpdateView.as_view(), name='edit_profile')
UpdateView
一个例子:
class ProfileUpdateView(UpdateView):
model = Freelancer
fields = ['email']
template_name = "profiles/profile_edit.html"
一个例子:
<form action="" method="post">{% csrf_token %}
{{ form.as_p }}
<input type="submit" value="Update" />
</form>
现在您需要在任何地方添加此链接:
<a href="{% url 'edit_profile' profile.pk %}">Edit</a>
当您访问该网址时,您将转到更新页面。