Как я создаю форму Django, которая отображает маркировку флажка направо от флажка?

Вы можете включить свою функцию в блок Runnable следующим образом

Runnable myFunction = () -> System.out.println("some function");

void runOnMain(Runnable runnable) {
  mActivity. runOnUiThread {
    runnable.run();
  }
}

Наконец, вызовите свой метод:

runOnMain(myFunction);

Я надеюсь, вы скоро переключитесь на Kotlin и выполните такие действия намного проще:)

33
задан Srikar Appalaraju 15 December 2012 в 12:50
поделиться

4 ответа

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

{% load pretty_forms %}
<form action="." method="POST">
{{ form.as_p|pretty_checkbox }}
<p><input type="submit" value="Submit"></p>
</form>

единственной разницей от простого шаблона Django является добавление {% загрузки %} тег шаблона и фильтр pretty_checkbox.

Вот функциональная, но ужасная реализация [1 118] pretty_checkbox - этот код не имеет никакой обработки ошибок, это предполагает, что сгенерированные атрибуты Django отформатированы в очень особенном методе, и это была бы плохая идея использовать что-либо как это в Вашем коде:

from django import template
from django.template.defaultfilters import stringfilter
import logging

register=template.Library()

@register.filter(name='pretty_checkbox')
@stringfilter
def pretty_checkbox(value):
    # Iterate over the HTML fragment, extract <label> and <input> tags, and
    # switch the order of the pairs where the input type is "checkbox".
    scratch = value
    output = ''
    try:
        while True:
            ls = scratch.find('<label')
            if ls > -1:
                le = scratch.find('</label>')
                ins = scratch.find('<input')
                ine = scratch.find('/>', ins)
                # Check whether we're dealing with a checkbox:
                if scratch[ins:ine+2].find(' type="checkbox" ')>-1:
                    # Switch the tags
                    output += scratch[:ls]
                    output += scratch[ins:ine+2]
                    output += scratch[ls:le-1]+scratch[le:le+8]
                else:
                    output += scratch[:ine+2]
                scratch = scratch[ine+2:]
            else:
                output += scratch
                break
    except:
        logging.error("pretty_checkbox caught an exception")
    return output

pretty_checkbox сканирует свой аргумент строки, находит пар < label> и < input> теги, и передвигают их если < input> тип тега является "флажком". Это также лишает последний знак маркировки, которая, оказывается, ':' символ.

Преимущества:

  1. Никакой futzing с CSS.
  2. разметка заканчивает тем, что смотрела способ, которым она, как предполагается.
  3. я не взламывал внутренности Django.
  4. шаблон хорош, компактен и идиоматичен.

Недостатки:

  1. код фильтра должен быть протестирован на захватывающие значения имен поля ввода и маркировок.
  2. существует, вероятно, что-то где-нибудь там, которое делает это лучше и быстрее.
  3. [еще 118] работа, чем я запланировал выполнение в субботу.
2
ответ дан 27 November 2019 в 18:06
поделиться

Порядок исходных данных и маркировок обеспечивается через normal_row параметр формы и нет никаких различных шаблонов строки для флажков. Таким образом, существует два способа сделать это (в 0,96 версиях точно):
1. переопределите _html_output формы
2. используйте CSS, чтобы сменить положение маркировки и флажка

1
ответ дан 27 November 2019 в 18:06
поделиться

Вот решение, которое я придумал (Django V1.1):

{% load myfilters %}

[...]

{% for field in form %}
    [...]
    {% if field.field.widget|is_checkbox %}
      {{ field }}{{ field.label_tag }}
    {% else %}
      {{ field.label_tag }}{{ field }}
    {% endif %}
    [...]
{% endfor %}

Вам нужно будет создать пользовательский тег шаблона ( В этом примере в файле «MyFilters.py»), содержащий что-то вроде этого:

from django import template
from django.forms.fields import CheckboxInput

register = template.Library()

@register.filter(name='is_checkbox')
def is_checkbox(value):
    return isinstance(value, CheckboxInput)

Доступно больше информации о пользовательских тегах шаблонов здесь .

Редактировать : В духе собственном ответа АСКЕРСА:

Преимущества:

  1. Нет Футета с CSS.
  2. Разметка в конечном итоге выглядит так, как он должен.
  3. Я не отталкивал внутренние джанго. (Но пришлось посмотреть на довольно кучу)
  4. Шаблон приятный, компактный и идиоматический.
  5. Фильтр-код воспроизводится приятно независимо от точных значений ярлыков и входных полей.

Недостатки:

  1. Вероятно, что-то где-то там, что делает это лучше и быстрее.
  2. Маловероятно, что клиент будет готов заплатить за все время, потраченное на это, просто чтобы переместить ярлык вправо ...
32
ответ дан 27 November 2019 в 18:06
поделиться

Я взял ответ от ромкинов и сделал его немного более общим

def field_type(field, ftype):
    try:
        t = field.field.widget.__class__.__name__
        return t.lower() == ftype
    except:
        pass
    return False

Таким образом, вы можете напрямую проверить тип виджета с помощью строки

{% if field|field_type:'checkboxinput' %}
    <label>{{ field }} {{ field.label }}</label>
{% else %}
    <label> {{ field.label }} </label> {{ field }}
{% endif %}
15
ответ дан 27 November 2019 в 18:06
поделиться
Другие вопросы по тегам:

Похожие вопросы: