2016-10-25 9 views
0

У меня есть ModelForm для моего риска создан как:Добавить ModelForm поле как атрибут к объекту

class RiskForm(forms.ModelForm): 
    class Meta: 
     model = Risk 
     fields = '__all__' 
    def __init__(self, *args, **kwargs): 
     progid = kwargs.pop('progid') 
     super(RiskForm, self).__init__(*args,**kwargs) 
     dict_of_fields = {} 
     all_char = Program.objects.get(id=progid).char_set.all() 
     for char in all_char: 
      c = [] 
      for cat in char.cat_set.all(): 
       c.append((cat.label, cat.label)) 
      dict_of_fields[char.label] = c 
      self.fields[char.label] = forms.ChoiceField(c) 

Если объект риски определяются как:

class Risk(models.Model): 
    program = models.ForeignKey(Program, on_delete=models.CASCADE) 
    label = models.CharField(max_length=200, default='') 

    def __str__(self): 
     return self.label 

Однако, я хочу, чтобы хранить дополнительные поля, которые я создал в моей базе данных под моим объектом Risk. Поскольку у меня есть это сейчас, в нем хранятся только две программы «атрибуты» и «метка». Тем не менее, я также хочу сохранить ответы на характеристики в моей базе данных для последующего использования.

Для получения дополнительной информации о том, как я установил вещи вверх: Django Form Based on Variable Attributes

и экран печати моей ModelForm: https://gyazo.com/89c9833613dbcc7e8d27cc23a3abaf72

Можно ли хранить все 6 ответов под моим объектом риска в моей базе данных? Если да, то как мне это сделать?

+0

Вы можете создать модель ответа и иметь много разных отношений с вашей моделью риска. – Kishan

+0

Не могли бы вы рассказать? Я все еще изучаю Python, и мой руководитель сказал, что я должен избегать многих отношений. Если нет другого пути, я не вижу другого способа, кроме как использовать их. Однако я понятия не имею, как это сделать. Не могли бы вы мне помочь/дать мне общий (контурный) код о том, как это написать? –

+0

Я бы предложил вам спросить своего руководителя, почему следует избегать отношений многих-ко-многим! Тем не менее, общая идея, которую я придерживаюсь, чтобы решить эту проблему, будет связана с ForeighKey, OneToOneField или ManyToManyField: Если вы можете сказать, что «один риск может иметь много ответов, один ответ может быть во многих рисках». Затем используйте ManyToManyField. Если вы можете сказать, что «у одного риска может быть много ответов, один ответ может быть в« Один риск ». Затем используйте« Foreignkey ». Я хочу знать, как ваши ответы связаны с риском или программами? – Kishan

ответ

0

формы в Django является пользователя объекта интерфейса: он дает пользователю набор полей, имеющему тип ответов INTO, проверяет, что данные, которые они поставляли действительно, и преобразует его из текста в желаемых данные в Python -тип (int, дата и т. д.). Это не должно касаться какой-либо конкретной модели, и часто это не так. Например, в интернет-магазине, вероятно, есть формы выбора покупки, которые добавляют данные о возможных заказах в сеанс пользователя, а не сразу же выполняют какие-либо обновления на объекте Product или Stock. Это происходит позже, при оформлении заказа.

ModelForm предполагает наличие отношения Model to Form. Обычно это правильный путь, когда между ответами пользователя и экземпляром одной модели существует простая связь.

Если у вас есть ситуация, когда ответы пользователя направляют создание нескольких объектов базы данных с менее прямой зависимостью от какого-либо конкретного объекта, вы, вероятно, не хотите ModelForm, просто форму. Также, вероятно, не модельное представление, а функциональное представление. Затем вы можете делать все, что вам нужно, между просмотром, собирающим параметры из парсера URL, и отображением формы для пользователя. Аналогично, что-либо между представлением, определяющим, что данные POST пользователя действительны, и сообщает пользователю, удалось ли его поданный запрос (или нет, и почему).

В этом случае я не понимаю, как вы хотите хранить все шесть ответов. Если есть предопределенный довольно небольшой набор ответов, у вас может быть один объект с шестью? 10? возможные наборы полей, которые могут быть нулевыми, чтобы указать, что этот объект не имеет этого объекта. Или, возможно, лучше, вы могли бы создать набор объектов ответа, каждый из которых имеет отношение внешнего ключа к объекту Risk, а затем ссылается на Risk.answer_set (все объекты Answer, которые имеют отношение внешнего ключа к вашему объекту риска). Это открытый объект, объект Risk может иметь что угодно от нуля до связанных с Bignum ответов.

+0

Основываясь на ваших первых трех абзацах, мне, вероятно, придется использовать форму и функцию, основанные на представлении. Спасибо за это, рассмотрим это позже в этот день. Учитывая ваш четвертый абзац. В моем проекте ничего предопределенного нет, это также «проблема». Можно произвольно создать программу с «неограниченным» количеством символов, и каждый символ имеет «неограниченное» количество возможных категорий на выбор. Таким образом, я должен использовать родительский идентификатор, чтобы получить правильные, я не могу сделать предопределенные наборы ответов. –

+0

На основании этого вам нужны модели программы, персонажа и категории. Каждая категория имеет внешний ключ для персонажа (поэтому персонаж имеет набор категорий), и каждый символ имеет внешний ключ для Программы. Пользователь выбирает программу. Затем вы можете динамически построить форму с вопросами, основанными на ответах на Character_set программы, на которые есть выбор, основанный на каждой категории Character_set (если я вас понимаю). Ответы, которые возвращаются, возможно, хранятся в кучке объектов «Ответ», которые могут иметь иностранные ключи к Лицу, который их представил, и Персонажу, к которому они относятся. – nigel222

+0

Извините за поздний ответ, некоторое время не было. Да, у меня есть это. До динамически построенной формы. На что я пытаюсь ответить на этот вопрос, как хранить эти ответы в объекте Answer. Кроме того, все ответы одной формы должны иметь одного и того же родителя и никого другого (таким образом, не Личность, которая подчиняется, а Риск, который соответствует этим ответам). Будет копать глубже в пути объектов «Ответ», а не «Объекты риска» (или, возможно, «Отвечать с ForeignKey Risk»). Спасибо большое! –