django-selectable在加载表单

时间:2017-01-29 21:50:15

标签: django jquery-ui-autocomplete

我以简单的形式成功实现了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输入值。 ?

感谢您帮助我。

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 ]