【问题标题】:Editing related models in profile form using django-profiles使用 django-profiles 以配置文件形式编辑相关模型
【发布时间】:2011-04-08 08:29:08
【问题描述】:

我在我的应用程序中使用django-profiles,因为它为我提供了一些简单的视图,可以帮助我更快地到达我想去的地方。

但是,我有一个问题。鉴于以下模型,我如何创建一个表单来编辑包含UserProfile 上的所有字段、User 中的 first_name、last_name 和电子邮件字段以及一个或多个 PhoneNumbers 上的所有字段?

from django.db import models
from django.contrib.auth.models import User
from django.utils.translation import ugettext_lazy as _

class UserProfile(models.Model):
    user = models.OneToOneField(User)
    height = models.IntegerField(_('Height'), max_length=3, blank=True, null=True, help_text=_('Users height in centimeters'))

    def get_absolute_url(self):
        return ('profiles_profile_detail', (), { 'username': self.user.username })
    get_absolute_url = models.permalink(get_absolute_url)

    def __unicode__(self):
        return self.user.username

class PhoneNumber(models.Model):
    description = models.CharField(_("Description"), max_length=32, blank=True)
    number = models.CharField(_("Phone number"), max_length=15)
    owner = models.ForeignKey(UserProfile, related_name="phone_numbers")

    def __unicode__(self):
        return u"%s (%s)" % (self.number, self.description)

到目前为止,我管理的最接近的表单是包含UserProfile 上的所有字段以及来自User 的所需字段,使用herehere 解释的技巧:

from django import forms
from main.models import UserProfile
from django.contrib.auth.models import User

class UserForm(forms.ModelForm):
    class Meta:
        model = User
        fields = ('first_name', 'last_name', 'email')

class ProfileForm(forms.ModelForm):
    def __init__(self, *args, **kwargs):
        # magic
        self.user = kwargs['instance'].user
        user_kwargs = kwargs.copy()
        user_kwargs['instance'] = self.user
        self.uf = UserForm(*args, **user_kwargs)
        # magic end

        super(ProfileForm, self).__init__(*args, **kwargs)

        self.fields.update(self.uf.fields)
        self.initial.update(self.uf.initial)

    def save(self, *args, **kwargs):
        # save both forms
        self.uf.save(*args, **kwargs)
        return super(ProfileForm, self).save(*args, **kwargs)

    class Meta:
        model = UserProfile
        exclude = ("user",)

在管理员中,在自定义 ModelAdmin 上使用内联,我得到了我想要的 PhoneNumbers 的行为,但我无法以单一形式重新创建它以与 django-profiles 一起使用。

这完全有可能吗,还是我应该放弃 django-profiles 并编写自己的配置文件应用程序,该应用程序可以使用表单集来拉入 PhoneNumbers?

【问题讨论】:

    标签: python django django-forms


    【解决方案1】:

    将两个模型形式塞进同一个形式是相当扭曲的。选择:

    • 创建自己的视图。您可以利用 django 网址的短路、先到先得的特性来盗版。

    • 将 django-profiles 带入您自己的版本控制中,并在不受可重用性限制的情况下将其破解为您喜欢的内容。

    • 您可以使用自己的保存方法创建一个大表单并使用 django-profiles。这比仅仅能够声明fields = ('first_name', 'last_name', 'email')exclude = ("user",) 更乏味。 See the docstrings

    取决于项目。我肯定会想自己写。个人资料应用程序没有太多功能,您可能会遇到其他您希望拥有更多控制权的地方。

    【讨论】:

      【解决方案2】:

      据我所知,django-profiles 绝对是一组美化的视图。我添加到我的应用程序但遇到了同样的问题。对源代码的检查表明它本质上是没有特征的。基本上,它省去了编写自己的edit_profilecreate_profile 视图的麻烦。真的,就是这样。除非您非常害怕编写自己的视图,否则不要费心使用 django-profiles,只需编写您自己的代码即可。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-11-07
        • 2018-11-30
        • 2014-06-17
        • 2011-12-23
        • 2011-04-15
        • 2014-04-29
        • 2021-04-17
        相关资源
        最近更新 更多