Добавить данные в класс формы Django, используя modelformset_factory - PullRequest
0 голосов
/ 22 июля 2009

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

class Category(models.Model):
  name = models.CharField(max_length=160)

class Item(models.Model):
  category = models.ForeignKey('Category')
  name = models.CharField(max_length=160)
  weight = models.IntegerField(default=0)

  class Meta:
    ordering = ('category','weight','name')

class BudgetValue(models.Model):
  value = models.IntegerField()
  plan = models.ForeignKey('Plan')
  item = models.ForeignKey('Item')

Я использую modelformset_factory для создания набора форм бюджетных значений для конкретного плана. То, что я хотел бы, это имя элемента и название категории для каждого BudgetValue. Когда я перебираю формы, каждая из них будет помечена правильно.

class BudgetValueForm(forms.ModelForm):
item = forms.ModelChoiceField(queryset=Item.objects.all(),widget=forms.HiddenInput())
plan = forms.ModelChoiceField(queryset=Plan.objects.all(),widget=forms.HiddenInput())

category = "" < assign dynamically on form creation >
item = "" < assign dynamically on form creation >
class Meta:
    model = BudgetValue
    fields = ('item','plan','value')

Я начал с создания словаря budgetvalue.item.category.name, budgetvalue.item.name и формы для каждого значения бюджета. Это передается в шаблон, и я отрисовываю его, как я и предполагал. Я предполагаю, что упорядочение форм в наборе форм и наборы запросов, используемые для генерации набора форм, сохраняют значения бюджета в том же порядке, и словарь создается правильно. То есть budgetvalue.item.name связано с правильной формой. Это пугает меня, и я думаю, что должен быть лучший путь. Любая помощь будет принята с благодарностью.

1 Ответ

3 голосов
/ 22 июля 2009

Ну, я разобрался с ответом на свой вопрос. Я переопределил класс init в форме и получил доступ к экземпляру модели. Работает именно так, как я хотел, и это было легко.

class BudgetValueForm(forms.ModelForm):
  item = forms.ModelChoiceField(queryset=Item.objects.all(),widget=forms.HiddenInput())
  plan = forms.ModelChoiceField(queryset=Plan.objects.all(),widget=forms.HiddenInput())

  def __init__(self, *args, **kwargs): 
    super(BudgetValueForm, self).__init__(*args, **kwargs) 
    self.itemname = self.instance.item.name 
    self.categoryname = self.instance.item.category.name 

  class Meta:
    model = BudgetValue
    fields = ('item','plan','value')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...