2017-02-05 6 views
7

참고 :이 질문은 유사하지만 Django 1.11 이전의 템플릿 기반 양식 렌더링을 릴리스 한 이전 질문과는 관련이 없습니다.Django 1.11 템플릿 기반 폼 렌더링을 사용하여 CSS 클래스를 위젯/필드에 추가하는 방법

장고에 템플릿 기반 폼 렌더링이 적용된 것을 알고 있습니다. 내가 이해하는 바에 따르면, 템플릿에 HTML/CSS를 모두 보관하는 대신보기 또는 양식에서 CSS 클래스를 삽입해야하는 문제를 해결해야합니다. 표시되는 내용을에 초점을 맞추고 내 양식 및보기를 유지하기 위해, 내 템플릿 표시되는 방법을에 초점을 맞추고 : 내 목표이다

. 그래서 모든 템플릿을 내 템플릿에 보관하고 싶습니다.

그래서, 내 질문은 :

  • 어떻게 템플릿 시스템에서 모든 TextInput 위젯 (form-text 예를 들어) 클래스를 추가하는 방법은 무엇입니까?
  • 템플릿 시스템의 모든 오류 메시지 (유효성 검사 실패)에 클래스 (예 : alert-warning)를 추가하려면 어떻게합니까?

이 새로운 기능에 대해 잘못 이해했을 수도 있습니다. 그렇다면 어떻게 작동하는지 또는 불가능한지 묻는다면 알려 주시기 바랍니다. 이상적으로,이 서식 렌더링 변경을 마스터 템플릿에 구현하고 싶습니다.

views.py 샘플 문제 :

class SignUp(generic.edit.CreateView): 

    model = models.User 
    template_name = 'usermgmt/sign_up.html' 
    form_class = forms.UserCreateForm 
    success_url = '/sign_up_done/' 

templates/master.html (I 클래스 얻기 위해 모든 TextInput 위젯을 유발하는 여기에 뭔가를 넣어 원하는) :

<html> 
<head> 
    <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0-alpha.6/css/bootstrap.min.css" integrity="sha384-rwoIResjU2yc3z8GV/NPeZWAv56rSmLldC3R/AZzGRnGxQQKnKkoFVhFQhNUwEyJ" crossorigin="anonymous"> 
<title>{% block title %}{% endblock %} | Website</title> 
</head> 
<body> 
    <div class="content-wrapper clearfix"> 
    {% block main %}{% endblock %} 
    </div> 
</body> 
</html> 

templates/usermgmt/sign_up.html :

{% extends 'master.html' %} 

{% block title %}Sign Up{% endblock %} 

{% block main %} 
<h1>Sign Up</h1> 
<p>Enter your email to sign up!</p> 
<form class="form-group" method="post"> 
    {% csrf_token %} 
    <input type="hidden" name="next" value="{{ next }}"> 
    {{ form.as_p }} 
    <button class="btn btn-primary" type="submit">Sign Up</button> 
</form> 
{% endblock %} 

답변

3

내가 알고있는 한 release notes of Django 1.11과 자신의 테스트에서 새로운 기능 을 사용하면 각 위젯 유형에 HTML 파일을 제공함으로써 위젯이 렌더링되는 방식을 쉽게 사용자 정의 할 수 있습니다. 이전 Django 버전에서는 forms.widget.Widget의 하위 클래스를 제공하고 해당 위젯을 모델/양식 필드에 하나씩 (IIRC) 할당해야했습니다.

TextInput 위젯에 특정 클래스가 있기를 원한다면 사용자 정의 text.html을 추가해야합니다 (물론 자신도 attrs.html 일 수 있습니다).

예를 들어, myforms 프로젝트에 main 앱이 있다고 가정 해 봅니다. 워드 프로세서에 따르면

를 프로젝트에서 다른 템플릿을 대체와 동일하게 작동 위젯 템플릿을 재정의 TemplatesSetting 렌더러를 사용하는 경우. 은 다른 기본 제공 렌더러를 사용하여 기본 제공 위젯 템플릿을 재정의 할 수 없습니다.

FORM_RENDERER = 'django.forms.renderers.TemplatesSetting' 

을하지만 우리는 그렇게 할 경우, 우리는 모든 입력 요소에 대한 템플릿을 제공해야 할 것 :

그래서 우리는 settings.py 파일에 우리의 렌더러를 설정해야합니다. 워드 프로세서에 따르면

을 내장 된 위젯 템플릿과 함께이 렌더러를 사용하여 필요 [...] INSTALLED_APPS에 'django.forms'트루 APP_DIRS = 적어도 하나 개 엔진 [추가]를.

django.formsINSTALLED_APPS을 추가합니다. 우리가 형태를 보여 주면,

<input type="text" class="myclass" value="{{widget.value}}"> 

: 그럼 이제, 텍스트 입력 요소 말하자면, 우리의 사용자 정의를 추가하기 위해, 우리는 파일 main/templates/django/forms/widgets/text.html을 만들고처럼, 거기에 우리의 사용자 정의 HTML 코드를 추가해야 예를 들어 CharField을 렌더링해야 할 때마다 해당 코드가 나타납니다.

필드 별 제어 수준이 필요한 경우 (예 : 각 필드마다 다른 클래스가 필요한 경우)이 모든 내용은 중요하지 않습니다. 이 경우 내가 작성한 것을 django-widget-tweaks과 결합해야 유연한 위젯 사용자 정의를 할 수 있습니다. 내 디렉토리 구조가 될 필요가 있음을 발견 장고 1.11에서, 위 호세의 Tomás Tocino의 대답에서 계속

+0

최고 답; 'custom-error' 클래스로 모든 오류 메시지를 어떻게 스타일링합니까? 오류 메시지가 "위젯"입니까? 필자는 수동으로'field.errors'를 주입하여 에러의 스타일을 지정할 수 있기 때문에 실제로 이것을 필요로하지 않습니다. 그러나 이것이 템플릿을 작성하는 것이 쉬운 방법인지 궁금합니다. –

+0

위의 템플릿 위치가 Anna Thomas의 대답 – Yunti

6

:

주/템플릿/장고/양식/위젯/text.html

+0

에 따라 업데이트되었습니다. 노력에 감사하지만 의견이나 수정이되어야합니다. 나는 네가 새로운 사용자라는 것을 알고있다. –

+2

@ GregSchmit 네 말이 맞아, 나는 논평하려했지만 대표는 없었어. 나는 의견의 어떤 종류 (희망을 갖고 다음 사람을 도울)가 아무 것도 아닌 것보다 낫다는 것을 알았다. 나를 투표하지 않은 것에 대해 감사합니다. –