пользовательское поле и виджет django

Я пишу настраиваемое поле/виджет для отображения нескольких полей ввода для связанных данных, например, мой продукт имеет 4 поля поиска, search1, search2, search3 и т. д., вместо того, чтобы определять каждое поле в моей форме, я хочу иметь одно поле, которое будет отображать столько полей ввода, сколько мне нужно (все связанные данные) в зависимости от его длины, вот что у меня есть до сих пор

class RelatedCategoryField(forms.MultiValueField):
    """
    Custom field to display multiple input boxes for a related object
    """

    def __init__(self, max_length, sub_max_length, label):
        # sub_max_length, is the max_length of each subfield
        self.total =  max_length/sub_max_length
        self.widget = CategoryWidget(self.total, label)
        fields = ()
        for num in range(self.total):
            fields += (forms.CharField(label="%s-%s" %(label, num),
                            max_length=sub_max_length),)
        super(RelatedCategoryField, self).__init__(fields, required=False)

    def compress(self, value_list):
        if value_list:
            return value_list
        return [[] for i in self.total]

class CategoryWidget(forms.MultiWidget):
    """
    Custom widget
    """
    def __init__(self, count, label):
        self.count = count
        self.label = label
        widgets = [forms.TextInput(attrs={}) for sub in range(self.count)]
        super(CategoryWidget, self).__init__(widgets)

    def decompress(self, value):
        if value:
            return value
        return [None for i in range(self.count)]

    def format_output(self, rendered_widgets):
        """
        Customize widget rendering
        """
        return render_to_string('fields/categoryfield.html', {'fields': rendered_widgets})

поэтому в основном я называю это поле так:

category = RelatedCategoryField(max_length=200, sub_max_length50, label="search")

затем на основе sub_max_length поле определяет, сколько полей оно создаст для этого многозначного поля, и тогда метка поля будет label+field# ( search_1, search_2, etc.. )

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


person Paulo    schedule 12.12.2011    source источник


Ответы (2)


я сделал что-то подобное в своем приложении, определив format_output следующим образом:

    def format_output(self, rendered_widgets):
        return mark_safe(u'<p class="placewidget">%s %s %s<br />%s %s %s %s %s %s</p>' % (
            _('Name:'), rendered_widgets[1],rendered_widgets[0],
            _('ZIP:'), rendered_widgets[2],
            _('City:'), rendered_widgets[3],
            _('State:'), rendered_widgets[4],
    ))

это отображает каждый виджет отдельно и с его меткой. Надеюсь, поможет

person FSp    schedule 05.01.2012

Я не знаю, это то, что вы ищете, так как это включает в себя редактирование шаблона, а не формы.

В вашем шаблоне вы можете сделать что-то вроде этого:

# In form_snippet.html:

{% for field in form %}
    <div class="fieldWrapper">
    {{ field.label_tag }}: {{ field }}
    </div>
{% endfor %}

Источник: https://docs.djangoproject.com/en/dev/topics/forms/#customizing-the-form-template

person zallarak    schedule 13.12.2011
comment
спасибо, но я попробовал, и это не работает :(, похоже, подполя никогда не получают атрибут label_tag - person Paulo; 14.12.2011
comment
@Пауло жаль это слышать. Я надеюсь, что вы в состоянии понять это! - person zallarak; 14.12.2011