代码之家  ›  专栏  ›  技术社区  ›  Epcylon

使用django profiles在profile表单中编辑相关模型

  •  2
  • Epcylon  · 技术社区  · 14 年前

    我在用 django-profiles 在我的应用程序中,它给了我一些简单的视图,帮助我更快地到达我想去的地方。

    然而,我有一个问题。考虑到下面的模型,如何创建一个表单来编辑一个包含所有字段的概要文件 UserProfile ,中的名、姓和电子邮件字段 User ,以及一个或多个 PhoneNumber 什么?

    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)
    

    用户配置文件 ,以及 用户 here here :

    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",)
    

    在admin中,在自定义ModelAdmin上使用内联线,我得到了 电话号码 s、 但我还不能用一个单独的形式重新创建它来与django配置文件一起使用。

    是有可能的,还是我应该抛弃django的个人资料,编写我自己的个人资料应用程序,可以使用一个formset来拉入 电话号码 什么?

    2 回复  |  直到 14 年前
        1
  •  1
  •   Skylar Saveland    14 年前

    把两个模型塞进同一个模型是一种扭曲。选择:

    • 提出你自己的观点。你可以利用django网址的短路,先到先服务的特性来盗版这个网址。

    • 将django配置文件引入到您自己的版本控制中,并在不受可重用性限制的情况下,将其修改为您的核心内容。

    • fields = ('first_name', 'last_name', 'email') exclude = ("user",) . See the docstrings

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

        2
  •  1
  •   Jordan Reiter    13 年前

    据我所知,django简介绝对只是一套美化的观点。我添加到我的应用程序,但遇到了相同的问题。对源代码的检查表明,它本质上是没有特性的。基本上,它省去了你自己写的麻烦 edit_profile create_profile 意见。真的,就这样。除非您对编写自己的视图有严重的恐惧,否则甚至不用麻烦使用django概要文件,只需编写自己的代码。