我以简单的形式成功实现了django可选择的AutoCompleteSelectField,允许您输入注释描述和相应的域类别(从其他多对一关系中选择的域和外键
请参阅:最相关的代码:
# MODEL
class Note(models.Model):
notetext = models.TextField(default='nota')
domain = models.ForeignKey(Domain)
def __str__(self):
return self.notetext
def get_absolute_url(self):
return reverse('note:note_detail', args= [self.id])
# FORM
class NoteForm(forms.ModelForm):
domainselect = AutoCompleteSelectField(lookup_class= DomainLookup, label='Pick a domain category', required=True,)
def __init__(self, *args, **kwargs):
super(NoteForm, self).__init__(*args, **kwargs)
domaintext = self.instance.domain.title
self.fields['domainselect'].widget = AutoCompleteSelectWidget(DomainLookup , { 'value': self.instance.domain.title } )
def save(self, commit=True):
self.instance.domain = self.cleaned_data['domainselect']
return super(NoteForm, self).save(commit=commit)
class Meta:
model = Note
fields = ('notetext',)
widgets = {
'domain' : AutoCompleteSelectWidget(DomainLookup), }
# VIEW
class EditNoteView(generic.edit.UpdateView):
model = Note
form_class = NoteForm
success_url = "/note/"
def get_queryset(self):
base_qs = super(EditNoteView, self).get_queryset()
return base_qs.filter()
def get_object(self):
object = get_object_or_404(Note,id=self.kwargs['id'])
return object
# TEMPLATE
{% extends "base_sidebar.html" %}
{%block content%}
<form action="" method="post">
{{form.as_p}}
<button type="submit">Save</button>
{% csrf_token %}
{% load selectable_tags %}
{{ form.media.css }}
{{ form.media.js }}
</form>
{%endblock%}
现在,当通过Modelform中的generic.edit.UpdateView选择现有记录进行编辑时,我想在加载表单时使用以前保存到数据库中的相应值(域描述和id)填充AutocompleteSelectField。 / p>
通过覆盖NoteForm的 init (self,* args,** kwargs)方法,在第一个HTML输入字段被填充的意义上,我几乎可以得到这么多。 但是,隐藏的输入值设置为相同的值,按下保存按钮会导致发布无效的表单,就好像没有选择域类别一样。
这是发送回浏览器的页面源:
<p><label for="id_domainselect_0">Pick a domain:</label>
<input data-selectable-allow-new="false" data-selectable-type="text" data-selectable-url="/selectable/domain-domainlookup/" id="id_domainselect_0" name="domainselect_0" type="text" value="politics" />
<input data-selectable-type="hidden" id="id_domainselect_1" name="domainselect_1" type="hidden" value="politics" /></p>
我不知道如何更改上下文(通过设置self.fields ['domainselect']。widget),以便将标题输入domainselect_0输入值,并将相应的pk输入隐藏的domainselect_1输入值。 ?
感谢您帮助我。
答案 0 :(得分:0)
在深入研究django-selectable和Django代码之后,看起来AutocompleteSelectWidget基于Django forms.MultiWidget类。
Django MultiWidget接受1个单值(列表),通过在解压缩方法中实现的机制将其分解为对应于各个“子窗口小部件”的值。 (参见https://github.com/mlavin/django-selectable/blob/master/selectable/forms/widgets.py class SelectableMultiWidget)
因此,您所要做的就是将包含标题和ID的列表分配给窗口小部件:
def __init__(self, *args, **kwargs):
super(NoteForm, self).__init__(*args, **kwargs)
self.initial['domainselect'] = [self.instance.domain.title , self.instance.domain.id ]