Редактирование связанных моделей в форме профиля с использованием django-профилей - PullRequest
2 голосов
/ 05 сентября 2010

Я использую django-profile в своем приложении, поскольку оно дает мне несколько простых представлений, которые помогают мне быстрее добраться туда, куда я хочу.

Однако у меня естьодна проблема.Учитывая приведенные ниже модели, как я могу создать форму для редактирования профиля, которая включает все поля UserProfile, поля first_name, last_name и email от User и одно или несколько PhoneNumber s?

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, используя приемы, объясненные здесь и здесь:

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

В администраторе, используя Inlines на пользовательском ModelAdmin, я получаю желаемое поведение для PhoneNumber s, но я не смог воссоздать его за один раз.Форма для использования с django-профилями.

Это вообще возможно, или я должен просто отказаться от django-профилей и написать свое собственное приложение-профиль, которое может использовать набор форм для ввода PhoneNumber s?

Ответы [ 2 ]

1 голос
/ 20 апреля 2011

Насколько я могу судить, профили django - это не что иное, как прославленный набор представлений.Я добавил в свое приложение, но столкнулся с той же проблемой.Изучение исходного кода показывает, что он, по сути, безликий.По сути, это избавляет вас от необходимости составления собственных edit_profile и create_profile представлений.На самом деле, это все.Если у вас нет ужасного страха написания своего собственного представления, даже не беспокойтесь об использовании django-профилей, просто сверните свой собственный код.

1 голос
/ 18 февраля 2011

- это искривление, позволяющее втиснуть две модели в одну и ту же форму.Выбор:

  • Создайте свой собственный вид.Вы можете использовать природу коротких замыканий, django url типа «первым пришел - первым обслужен» для пиратства этого.

  • Внесите профили django в свой собственный контроль версий и взломайте его на свойСодержимое сердца без ограничений на повторное использование.

  • Вы можете просто создать одну большую форму с помощью собственного метода сохранения и использовать на месте профили django.Это было бы более утомительно, чем просто объявить fields = ('first_name', 'last_name', 'email') и exclude = ("user",). См. Строки документации

Зависит от проекта.Я определенно хотел бы написать свой собственный.В приложении профилей нет ничего особенного, и вы можете столкнуться с другими местами, где вы хотели бы иметь больше контроля.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...