Django : 양식의 입력 필드에 임의의 html 속성을 어떻게 추가합니까?


101

다음과 같은 템플릿으로 렌더링되는 입력 필드가 있습니다.

<div class="field">
   {{ form.city }}
</div>

다음과 같이 렌더링됩니다.

<div class="field">
    <input id="id_city" type="text" name="city" maxlength="100" />
</div>

이제 autocomplete="off"렌더링되는 입력 요소에 속성 을 추가한다고 가정 합니다. 어떻게해야합니까? 아니면 onclick="xyz()"class="my-special-css-class"?

답변:


126

이 페이지 확인

city = forms.CharField(widget=forms.TextInput(attrs={'autocomplete':'off'}))

2
네, 감사합니다. 제 경우에는 ModelForm을 사용하고 있으므로 양식 필드를 명시 적으로 정의하지 않습니다 (예 : class AddressForm (forms.ModelForm) : class Meta : model = models.Address) 이것은 내가 ModelForm을 사용할 수 없거나 특별한 것이 있다는 것을 의미합니까? 할 필요가?
사용자


1
@InfinitelyLoopy init for form, 당신은 몇 가지 코드를 추가하여 필드를 잡고 위젯 속성을 수정할 수 있습니다. 다음은 3 개 필드를 수정하기 위해 이전에 사용한 일부입니다.```for field_name in [ 'image', 'image_small', 'image_mobile'] : field = self.fields.get (field_name) field.widget.attrs [ 'data- 파일 '] ='파일 '```
스튜어트 축삭

4
'필수'및 '자동 초점'과 같은 인수를 사용하지 않는 속성은 어떻습니까?
Wilhelm Klopp

1
이 솔루션은 문제가 분리되지 않기 때문에 좋지 않습니다. HTML 속성은 파이썬 코드 IMO로 작성해서는 안됩니다. Mikhail Korobov 솔루션이 우수합니다.
David D.

115

광고에 대해 미안하지만 최근에 이러한 작업을 덜 고통스럽게 만드는 앱 ( https://github.com/kmike/django-widget-tweaks )을 출시하여 디자이너가 파이썬 코드를 건드리지 않고도 할 수 있습니다.

{% load widget_tweaks %}
...
<div class="field">
   {{ form.city|attr:"autocomplete:off"|add_class:"my_css_class" }}
</div>

또는,

{% load widget_tweaks %}
...
<div class="field">
   {% render_field form.city autocomplete="off" class+="my_css_class" %}
</div>

3
멋진 앱 Mike, 내가 찾던 바로 그것!
jmagnusson 2011 년

문서는 설정에서 설치된 앱에 "widget_tweaks"를 추가하라고 지시하지 않습니다. 문서에 추가 할 가치가있을 수 있습니다.
James Lin

안녕하세요 James, 강조하지는 않지만 '설치'섹션에는 INSTALLED_APPS에 'widget_tweaks'를 추가하는 것에 대한 메모가 이미 있습니다.
Mikhail Korobov 2011

@MikhailKorobov이 앱에 감사드립니다. 이것은 내가 찾던 옳은 일이었습니다. ModelForm의 양식이 필요했고이 속성을 모든 단일 필드 (그 중 40 개)에 수동으로 삽입하고 싶지 않았기 때문에 몇 초 만에 동일한 결과를 얻을 수있었습니다. :) 이것이 허용되는 대답이어야합니다!
Ljubisa Livac

그런 응용 프로그램을 작성할 계획이었습니다. 저의 노력을 아껴 주셔서 감사합니다.
아누 즈 TBE

31

"ModelForm"을 사용하는 경우 :

class YourModelForm(forms.ModelForm):
    def __init__(self, *args, **kwargs):
        super(YourModelForm, self).__init__(*args, **kwargs)
        self.fields['city'].widget.attrs.update({
            'autocomplete': 'off'
        })

3
좋은! 이제 모든 위젯을 명시 적으로 정의 할 필요가 없습니다.
Mikael Lindlöf

20

을 사용하는 경우 그의 답변에 제공된 @Artificioo ModelForm로 사용할 가능성을 제외 하고 Meta에 해당 문제에 대한 사전이 있습니다.__init__widgets

class AuthorForm(ModelForm):
    class Meta:
        model = Author
        fields = ('name', 'title', 'birth_date')
        widgets = {
            'name': Textarea(attrs={'cols': 80, 'rows': 20}),
        }

관련 문서


1
이 위 ... 가끔 장고 / 파이썬 개발자는 단지 일을 열심히 방법을 선호 생각하는 답보다 upvotes을 가지고 왜 ... 알아 내려고
trpt4him

@ trpt4him init 접근 방식을 사용하면 다른 Forms에서 재사용 할 수있는 Mixin 또는 Base Class를 만드는 데 유용합니다. 이것은 중대형 프로젝트에서 일반적입니다. Meta.widgets는 단일 양식에 적합합니다. 그래서 둘 다 좋은 대답입니다.
Akhorus 2015 년

2

이 일을 위해 전체 앱을 사용하고 싶지 않았습니다. 대신 https://blog.joeymasip.com/how-to-add-attributes-to-form-widgets-in-django-templates/ 에서 다음 코드를 찾았습니다.

# utils.py
from django.template import Library
register = Library()

@register.filter(name='add_attr')
def add_attr(field, css):
    attrs = {}
    definition = css.split(',')

    for d in definition:
        if ':' not in d:
            attrs['class'] = d
        else:
            key, val = d.split(':')
            attrs[key] = val

    return field.as_widget(attrs=attrs)

html 파일의 태그 사용

{% load utils %}
{{ form.field_1|add_attr:"class:my_class1 my_class2" }}
{{ form.field_2|add_attr:"class:my_class1 my_class2,autocomplete:off" }}

0

최종 양식보기 및 렌더링Django 양식에서 모델을 만들고 업데이트하기 위해 재사용 가능한 양식 템플릿을 만드는 데 며칠을 보냈습니다. ModelForm을 사용하여 개체를 변경하거나 만듭니다. 내 양식을 스타일링하기 위해 부트 스트랩도 사용하고 있습니다. 과거에는 일부 양식에 django_form_tweaks를 사용했지만 템플릿 종속성이 많지 않은 사용자 정의가 필요했습니다. 프로젝트에 이미 jQuery가 있으므로 해당 속성을 활용하여 양식 스타일을 지정하기로 결정했습니다. 다음은 코드이며 모든 형식으로 작업 할 수 있습니다.

#forms.py
from django import forms
from user.models import User, UserProfile
from .models import Task, Transaction

class AddTransactionForm(forms.ModelForm):
    class Meta:
       model = Transaction
       exclude = ['ref_number',]
       required_css_class = 'required'

Views.py

@method_decorator(login_required, name='dispatch')
class TransactionView(View):
def get(self, *args, **kwargs):
    transactions = Transaction.objects.all()
    form = AddTransactionForm
    template = 'pages/transaction.html'
    context = {
        'active': 'transaction',
        'transactions': transactions,
        'form': form
    }
    return render(self.request, template, context)

def post(self, *args, **kwargs):
    form = AddTransactionForm(self.request.POST or None)
    if form.is_valid():
        form.save()
        messages.success(self.request, 'New Transaction recorded succesfully')
        return redirect('dashboard:transaction')
    messages.error(self.request, 'Fill the form')
    return redirect('dashboard:transaction')

HTML 코드 참고 : 많은 뷰를 만드는 번거 로움을 없애기 위해 bootstrap4 모달을 사용하고 있습니다. 일반 CreateView 또는 UpdateView를 사용하는 것이 더 낫습니다. 부트 스트랩과 jqQery 연결

 <div class="modal-body">
    <form method="post" class="md-form" action="." enctype="multipart/form-data">
      {% csrf_token %}
      {% for field in form %}
      <div class="row">
        <div class="col-md-12">
          <div class="form-group row">
            <label for="" class="col-sm-4 col-form-label {% if field.field.required %}
            required font-weight-bolder text-danger{%endif %}">{{field.label}}</label>
            <div class="col-sm-8">
              {{field}}
            </div>

          </div>
        </div>
      </div>

      {% endfor %}

      <input type="submit" value="Add Transaction" class="btn btn-primary">
    </form>
  </div>

자바 스크립트 코드 는 이것을 $(document).ready(function() { /* ... */});함수 에로드하는 것을 기억하십시오 .

var $list = $("#django_form :input[type='text']");
$list.each(function () {
    $(this).addClass('form-control')
  });
  var $select = $("#django_form select");
  $select.each(function () {
    $(this).addClass('custom-select w-90')
  });
  var $list = $("#django_form :input[type='number']");
  $list.each(function () {
    $(this).addClass('form-control')
  });
  var $list = $("form :input[type='text']");
  $list.each(function () {
    $(this).addClass('form-control')
  });
  var $select = $("form select");
  $select.each(function () {
    $(this).addClass('custom-select w-90')
  });
  var $list = $("form :input[type='number']");
  $list.each(function () {
    $(this).addClass('form-control')
  });
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.