2017-01-29 21 views
0

djangoで選択可能なAutoCompleteSelectFieldを簡単なフォームで実装しました。これにより、ノートの説明と対応するドメインカテゴリ(他の多対1の関係django-selectable populate 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を経由して編集するために選択され、私は対応する値(ドメインの説明でAutocompleteSelectFieldを移入したいとid)以前はロード時にデータベースに保存されていましたフォーム。

NoteFormのinit(self、* args、** kwargs)メソッドを上書きすることで、最初のHTML入力フィールドにデータが入力されるという意味で、これまでのところほとんどこれを取得できました。 しかし、非表示の入力値は同じ値に設定され、保存ボタンを押すとドメインカテゴリが選択されていないかのように有効でないフォームが表示されます。

ここでブラウザに送り返されるページのソースです:(。self.fieldsを設定することにより、[「domainselectを」]ウィジェット)

<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> 

私は、コンテキストを変更する方法がわからないのためにタイトルをdomainselect_0入力値に、対応するpkを非表示のdomainselect_1入力値に取得します。 ?

私を助けてくれてありがとう。

答えて

0

djangoで選択可能なコードとDjangoコードを掘り下げた後、AutocompleteSelectWidgetはDjangoのforms.MultiWidgetクラスに基づいています。 Django MultiWidgetは、解凍メソッドで実装されたメカニズムを通じてそれぞれの 'サブウィジェット'に対応する値に分解された1つの単一の値(リスト)を受け入れます。

def __init__(self, *args, **kwargs): 
     super(NoteForm, self).__init__(*args, **kwargs) 
     self.initial['domainselect'] = [self.instance.domain.title , self.instance.domain.id ] 
:ウィジェットにタイトルとidを含むリストを割り当てる

だから、あなたがしなければならないすべてはある( https://github.com/mlavin/django-selectable/blob/master/selectable/forms/widgets.pyクラスSelectableMultiWidgetを参照してください)
関連する問題