Создайте форму из моделей, используя ModelForm, в моделях много иностранных ключей (один класс является внешним ключом для другого) - PullRequest
0 голосов
/ 27 ноября 2010

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

Мои модели выглядят как

class Employee(Person):
   nickname = models.CharField(_('nickname'), max_length=25, null=True,
     blank=True)
   blood_type = models.CharField(_('blood group'), max_length=3, null=True,
     blank=True, choices=BLOOD_TYPE_CHOICES)
   marital_status = models.CharField(_('marital status'), max_length=1,
     null=True, blank=True, choices=MARITAL_STATUS_CHOICES)
   nationality = CountryField(_('nationality'), default='IN', null=True,
     blank=True)
   about = models.TextField(_('about'), blank=True, null=True)

   dependent = models.ManyToManyField(Dependent,
     through='DependentRelationship')

   pan_card_number = models.CharField(_('PAN card number'), max_length=50,
     blank=True, null=True)
   policy_number = models.CharField(_('policy number'), max_length=50,
     null=True, blank=True)

   # code specific details
   user = models.OneToOneField(User, blank=True, null=True,
     verbose_name=_('user'))
   date_added = models.DateTimeField(_('date added'), auto_now_add=True)
   date_modified = models.DateTimeField(_('last modified'), auto_now=True)

   @models.permalink
   def get_absolute_url(self):
     return ('contacts_employee_detail', [str(self.id)])

class Person(models.Model):
  """Person model"""

  title = models.CharField(_('title'), max_length=20, null=True, blank=True)
  first_name = models.CharField(_('first name'), max_length=100)
  middle_name = models.CharField(_('middle name'), max_length=100, null=True,
      blank=True)
  last_name = models.CharField(_('last name'), max_length=100, null=True,
      blank=True)
  suffix = models.CharField(_('suffix'), max_length=20, null=True,
      blank=True)

  slug = models.SlugField(_('slug'), max_length=50, unique=True)

  phone_number = generic.GenericRelation('PhoneNumber')
  email_address = generic.GenericRelation('EmailAddress')
  address = generic.GenericRelation('Address')

  date_of_birth = models.DateField(_('date of birth'), null=True, blank=True)
  gender = models.CharField(_('gender'), max_length=1, null=True,
     blank=True, choices=GENDER_CHOICES)

class Address(models.Model):
 """Street Address model"""

  TYPE_CHOICES = (
     ('c', _('correspondence address')),
     ('p', _('present address')),
     ('m', _('permanent address')),
  )

  address_type = models.CharField(_('address type'), max_length=1,
    choices=TYPE_CHOICES)

  content_type = models.ForeignKey(ContentType,
     limit_choices_to={'app_label': 'contacts'})
  object_id = models.PositiveIntegerField()
  content_object = generic.GenericForeignKey()

  street = models.TextField(_('street'), blank=True, null=True)
  city = models.CharField(_('city'), max_length=200, blank=True, null=True)
  province = models.CharField(_('State/UT'), max_length=200, blank=True,
     null=True)
  post_code = models.CharField(_('postal code'), max_length=15, blank=True,
     null=True)
  country = CountryField(_('country'), default='IN')

  date_added = models.DateTimeField(_('date added'), auto_now_add=True)
  date_modified = models.DateTimeField(_('date modified'), auto_now=True)

Поэтому, пожалуйста, если кто-нибудь может мне помочь или предложить мне несколько полезных ссылок, откуда я могу получить некоторую помощь.Спасибо !!!

1 Ответ

0 голосов
/ 27 ноября 2010

Вот документация ...

Базовое использование:

class EmployeeForm(ModelForm):
    class Meta:
        model = Employee
        fields = ('somefield','otherfield')

и т. Д.

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

class EmployeeForm(ModelForm):
    otherfield = forms.CharField(...)
    class Meta:
        model = Employee
        fields = ('somefield','otherfield')

Это означает, что ваша форма создана из моделей Employee, somefield и otherfield."будет добавлено в качестве полей формы, а поле somefield будет заполнено непосредственно из вашей модели, но другое поле будет определено так, как если бы вы переопределяли его в классе формы ...

EDIT: переопределение используется для небольших изменений,поэтому неправильно менять тип данных поля ... Поскольку вы дали полю одноименное имя, проблем нет, оно сопоставит поле связанной модели с использованием имени поля формы ... Итак,:

class SomeModel(Model):
    somefield = CharField()

class SomeForm(ModelForm):
    somefield = Charfield(Widget=...)
    class Meta:
        model = SomeModel

Поскольку имена полей эквивалентны, проблем нет ... Основная причина переопределения заключается в том, что вы можете использовать виджет для изменения внешнего вида поля формы (создание TextField выглядит следующим образом:одинline Charfield) или передайте некоторые атрибуты (например, определяя столбцы и строки текстового поля, или добавьте указатель даты simlpe в поле datetime.Или вы можете использовать параметр choices для заполнения поля меткой-значением пар ...

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

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