내 Django 응용 프로그램에 대한 사용자 정의 위젯을 작성하여 Twitter Bootstrap의 버튼 그룹과 선택한 여러 위젯 (해당 항목을 마음에 들지 않았습니다)을 인터페이스했습니다. 그것은 한 가지를 제외하고는 아름답게 작동합니다. 데이터베이스 객체에서 양식을 인스턴스화하면 값이 채워지지 않습니다.django : 내 사용자 정의 위젯이 데이터베이스 객체의 값으로 채워지지 않는 이유는 무엇입니까?
정말 수수께끼가되는 부분은 request.POST를 생성자에 전달하는 양식을 만들 때 이러한 위젯을 채우는 것입니다. 그것은 통해 오는 데이터 또는 POST 개체 대 대 데이터베이스 개체에서 양식을 채우는 방식에 차이가있을 것으로 보이지만 거기에서 어디로 갈지 잘 모르겠습니다.
다음은 위젯의 : 경우 당신은 내가 다음 폰과 태블릿 선택 여러 위젯에 다시 스와핑 큰 화면의 버튼을 보여주기 위해 CSS를 사용하고, 혼란스러워에서
from itertools import chain
from django.forms.util import flatatt
from django.forms.widgets import CheckboxSelectMultiple
from django.utils.encoding import force_unicode
from django.utils.html import conditional_escape
from django.utils.safestring import mark_safe
# todo-devon Values are not preserved with object instances
class BootstrapButtonSelect(CheckboxSelectMultiple):
def __init__(self, attrs=None, all=False, none=False, classes=[], layout='horizontal'):
"""
Optional arguments for creating a BootstrapButtonSelect widget. Default settings are in brackets.
all=True/[False]
Adds a button to select all options when set to True.
none=True[False]
Adds a button to select none of the options when set to True.
classes=[]
A list of strings which adds CSS classes to the buttons making up the button select widget. The btn class is already included. Examples: 'btn-large', 'btn-primary'
layout=['horizontal']
Sets the layout of the button select widget to 'horizontal' or 'vertical' (Not yet implemented. All groups are currently vertical.)
"""
super(BootstrapButtonSelect, self).__init__(attrs)
self.all = all
self.none = none
self.layout = layout
if classes:
self.classes = u' %s' % u' '.join(classes)
else:
self.classes = u''
def render(self, name, value, attrs=None, choices=()):
"""
Builds button group and select list for widget
"""
# todo-devon Add code for horizontal layout
if value is None: value = []
has_id = attrs and 'id' in attrs
final_attrs = self.build_attrs(attrs, name=name)
# Create the select multiple widget
select_output = [u'<select class="button-toggles" id="%s" multiple="multiple"%s>' % (name, flatatt(final_attrs),)]
for i, (option_value, option_label) in enumerate(chain(self.choices, choices)):
# If an ID attribute was given, add a numeric index as a suffix,
# so that the checkboxes don't all have the same ID attribute.
if has_id:
final_attrs = dict(final_attrs, id='%s_%s' % (attrs['id'], i,))
option_value = force_unicode(option_value)
option_label = conditional_escape(force_unicode(option_label))
if option_value in value:
select_output.append(u'<option value="%s" selected="selected">%s</label>' % (option_value, option_label))
else:
select_output.append(u'<option value="%s">%s</label>' % (option_value, option_label))
select_output.append('</select>')
select_output = u'\n'.join(select_output)
# Create the button group
button_output = [u'<div class="btn-select-vertical span3 hidden-phone" id="%s" data-toggle="buttons-checkbox">' % name]
for i, (option_value, option_label) in enumerate(chain(self.choices, choices)):
# If an ID attribute was given, add a numeric index as a suffix,
# so that the checkboxes don't all have the same ID attribute.
if has_id:
final_attrs = dict(final_attrs, id='%s_%s' % (attrs['id'], i,))
label_for = u' for="%s"' % final_attrs['id']
else:
label_for = ''
option_value = force_unicode(option_value)
option_label = conditional_escape(force_unicode(option_label))
button_output.append(u'<label%s class="btn%s" id="btn-%s-%s" data-name="%s,%s">%s</label>' % (label_for, self.classes, name, option_value, name, option_value, option_label))
button_output.append(u'</div>')
button_output = u'\n'.join(button_output)
# Buttons for select all or none
if self.all or self.none:
select_all_none_button_output = [u'<div class="btn-group all-none-buttons" data-toggle="buttons-radio" data-name="%s">' % name]
if self.all:
select_all_none_button_output.append(u'<button class="select-all btn%s" type="button" data-name="%s">All</button>' % (self.classes, name,))
if self.none:
select_all_none_button_output.append(u'<button class="select-none btn%s" type="button" data-name="%s">None</button>' % (self.classes, name,))
select_all_none_button_output.append(u'</div>')
select_all_none_button_output = u'\n'.join(select_all_none_button_output)
# Full output
if select_all_none_button_output:
output = "%s\n%s\n%s" % (select_output, button_output, select_all_none_button_output)
else:
output = "%s\n%s" % (select_output, button_output)
return mark_safe(output)
class Media:
js = ('/static/bootstrap-button-multiselect.js',)
css = {
'all': ('/static/bootstrap-button-multiselect.css',)
}
. 내보기 기능 :
from django.http import HttpResponseRedirect
from django.shortcuts import render_to_response
from django.template.context import RequestContext
from tickets.forms import TicketForm
from tickets.models import Ticket
def addEditTicket(request, op='add', encrypted_pk=None, cipher=None):
"""
Form and processing for new tickets
"""
if encrypted_pk is not None:
pk = int(encrypted_pk)^cipher
ticket = Ticket.objects.get(pk=pk)
form = TicketForm(instance=ticket)
initialData = {'form': form, 'form_action': '/ticket/' + op + '/', 'title': op.capitalize() + ' a ticket'}
csrfContext = RequestContext(request, initialData) # adds CSRF token to form context
return render_to_response('form.html', csrfContext) # pass context with token to form
if request.method == 'POST':
form = TicketForm(request.POST)
if form.is_valid():
new_ticket = form.save()
form = TicketForm(instance=new_ticket)
# todo-devon Notify user in new form that object was saved
# Context includes form object, URL for form action (dynamically generated from argument passed as op),
# and a title dynamically generated from operation combined with the object type in question.
initialData = {'form': form, 'form_action': '/ticket/edit/', 'title': 'Edit a ticket'}
csrfContext = RequestContext(request, initialData) # adds CSRF token to form context
return render_to_response('form.html', csrfContext) # pass context with token to form
else:
form = TicketForm()
# Context includes form object, URL for form action (dynamically generated from argument passed as op),
# and a title dynamically generated from operation combined with the object type in question.
initialData = {'form': form, 'form_action': '/ticket/' + op + '/', 'title': op.capitalize() + ' a ticket'}
csrfContext = RequestContext(request, initialData) # adds CSRF token to form context
return render_to_response('form.html', csrfContext) # pass context with token to form
죄송합니다.이 코드를 모두 여기에 버리십시오. 미리 감사드립니다.
편집 : 자바 스크립트를 내 보냅니다. 질문과 관련성이 없었기 때문에 질문이 더 어려워 보였습니다.