UpdateView并链接到用户

时间:2015-11-13 16:10:18

标签: python django

我被告知,在更新用户时,我应该使用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时 - 在模式中自动创建 - 它不会检索自由职业者。根据我的模型,我该怎么办?

2 个答案:

答案 0 :(得分:1)

我认为使用电子邮件地址作为主键是个坏主意。如果用户更改了他们的电子邮件地址该怎么办?

为电子邮件地址设置unique=True可能更好一点,让Django创建自动主键。然后在您的网址中加入(?P<pk>\d+)/即可。

如果您必须使用电子邮件作为主键,则需要将(?P<pk>\d+)/的正则表达式更改为

(?P<pk>[\w@.-]+)

上述内容可能无法捕获所有电子邮件地址。我认为Django包含一个更好的角色类,但我现在无法找到它。

答案 1 :(得分:0)

我认为你只是以错误的方式做这件事。 以下是您需要做的事情:

首先,我建议您在模型中添加一个PK,因为将电子邮件作为pk是一个坏主意。

  1. 为更新视图创建url
  2. 一个例子:

    url(r'^profile/(?P<pk>[\d]+)/edit/$',
            views.ProfileUpdateView.as_view(), name='edit_profile')
    
    1. 创建UpdateView
    2. 一个例子:

      class ProfileUpdateView(UpdateView):
          model = Freelancer
          fields = ['email']
          template_name = "profiles/profile_edit.html"
      
      1. 为表单
      2. 创建模板

        一个例子:

        <form action="" method="post">{% csrf_token %}
            {{ form.as_p }}
            <input type="submit" value="Update" />
        </form>
        

        现在您需要在任何地方添加此链接:

        <a href="{% url 'edit_profile' profile.pk %}">Edit</a>
        

        当您访问该网址时,您将转到更新页面。