ФорумПрограммированиеPythonDjango → Вывод данных с двух моделей в select-box формы

Вывод данных с двух моделей в select-box формы

  • john2dark

    Сообщения: 98 Репутация: N Группа: Адекваты

    Spritz 27 марта 2016 г. 15:31

    Есть две таблички, на уровне базы это выглядит так:
    Parent:
    +----+---------+
    | Id | Name |
    +----+---------+
    | 1 | Test #1 |
    | 2 | Test #2 |
    | 3 | Test #3 |
    +----+---------+

    Child:
    +----+---------+-----------+
    | Id | Traffic | parent_id |
    +----+---------+-----------+
    | 1 | 1000 | 1 |
    | 2 | 2000 | 3 |
    +----+---------+-----------+
    связаны через FK в чайлде.

    Технически нужна выборка для queryset, что-то типа

    select p.parent_id, c.name from child c, parent p where c.parent_id = p.id

    Модели просты, в чайлде поле

    parent = models.ForeignKey(Parent, on_delete=models.CASCADE)

    А вот форма

    class NewForm(forms.Form):
        query = Child.objects.all()....
    
        selectbox = forms.ModelChoiceField(queryset=query,
                                           required=True,
                                           initial=0,
                                           widget=forms.Select,
                                           label=_(u'Select field'))
        class Meta:
            fields = [
                'selectbox',
            ]

    Никак не мог фтыкнуть как сделать нужный queryset, в итоге получилось сделать это:

    query = Child.objects.all().values_list('parent_id', 'parent__name')

    И получить в итоге на шаблоне вот такое:

    <select class="form-control required valid" name="child">
    <option value="(1L, u'Test #1')">(1L, u'Test #1')</option>
    <option value="(3L, u'Test #3')">(3L, u'Test #3')</option>
    </select>

    Подскажите пожалуйста, каким образом можно привести это непотребство к виду

    <select class="form-control required valid" name="child">
    <option value="1">Test #1</option>
    <option value="3">Test #3</option>
    </select>

    Спустя 67 сек.

    А чёт таблицы поплыли, пробелы походу режутся :(

  • phpdude

    Сообщения: 26617 Репутация: N Группа: в ухо

    Spritz 27 марта 2016 г. 15:34, спустя 3 минуты 8 секунд

    не стал разбираться что ты делаешь не так, но вот тебе пример

    models.InformationPageName.objects.values_list('name', flat=True)

    Спустя 41 сек.

    хотя я щас понял что тебе не это надо

    некогда щас завтра если что

    Сапожник без сапог
  • john2dark

    Сообщения: 98 Репутация: N Группа: Адекваты

    Spritz 27 марта 2016 г. 15:41, спустя 6 минут 48 секунд

    Не вопрос.
    Буду рад любой подсказке. Если сам нарою, отпишу как решил, может тоже кому пригодится.

  • Sinkler

    Сообщения: 9658 Репутация: N Группа: в ухо

    Spritz 27 марта 2016 г. 16:19, спустя 38 минут 26 секунд

    @john2dark, можно захардкорить что-то типа

    class NewForm(forms.Form):
        selectbox = forms.Field(widget=forms.Select, required=True)
    
        def __init__(self, *args, **kwargs):
            super(NewForm, self).__init__(*args, **kwargs)
            if hasattr(self, 'instance'):
                self.fields['selectbox'].widget.choices = [(p.id, p.title) for p in get_custom_data_here()]
  • john2dark

    Сообщения: 98 Репутация: N Группа: Адекваты

    Spritz 27 марта 2016 г. 16:44, спустя 25 минут 10 секунд

    Понял, спасибо. Щас попробую. Была еще дикая мысль свой ModelChoiceField написать.

  • phpdude

    Сообщения: 26617 Репутация: N Группа: в ухо

    Spritz 27 марта 2016 г. 17:22, спустя 37 минут 25 секунд

    @john2dark, когда в жанге возникает мысль написать что-то своё - лови себя на мысли что ты что-то делаешь не так

    Спустя 34 сек.

    @Sinkler, на глаз да, это должно сработатьб

    Сапожник без сапог
  • john2dark

    Сообщения: 98 Репутация: N Группа: Адекваты

    Spritz 27 марта 2016 г. 19:56, спустя 2 часа 34 минуты 13 секунд

    Вот что вышло в итоге:

    def get_server_list():
        return Resources.objects.all().values_list('server_id',
                                                   'server__public_name')
    
    class ProjectNewForm(forms.Form):
        project_name = forms.CharField(required=True,
                                       min_length=2,
                                       max_length=14,
                                       label=_(u'Project name'))
        project_description = forms.CharField(required=True,
                                              max_length=2000,
                                              widget=forms.Textarea(
                                                  attrs={'rows': 4}
                                              ),
                                              label=_(u'Project description'))
        server = forms.Field(required=True,
                             widget=forms.Select,
                             label=_(u'Server'))
    
        class Meta:
            fields = [
                'project_name',
                'project_description',
                'server',
            ]
    
        def __init__(self, *args, **kwargs):
            super(ProjectNewForm, self).__init__(*args, **kwargs)
            self.fields['server'] = \
                forms.ChoiceField(choices=
                                  [(o[0], str(o[1])) for o in get_server_list()]
                                  )

    Работает как надо :)
    Спасибо!

Пожалуйста, авторизуйтесь, чтобы написать комментарий!