2016-12-23 2 views
0

私は自分のプロジェクトにDjango-autocomplete-lightを含めようとしています。オートコンプリートによる新しい選択肢の作成を含め、すべてが期待どおりに機能します。唯一の問題は、モデルに複数のフィールドが含まれていて、「名前」フィールドにのみオートコンプリートを使用していることです。私が新しいレコードを保存すると、django-adminは、すでにオートコンプリートで作成されたレコードを更新するのではなく、データベースに同じ名前の新しいオブジェクトを作成します。最後に私は2つのレコードを持っています。半分が空で、オートコンプリートで作成され、もう1つはdjango-adminによって作成されたものです。Django adminとautocomplete-light - 保存方法を無効にする方法

models.py

class Montinent(models.Model): 
    name = models.CharField(max_length=250) 
    code = models.CharField(max_length=2, unique=True, db_index=True) 
    created = models.DateTimeField(auto_now_add=True) 

    class Meta: 
     ordering = ('-name',) 

    def __str__(self): 
     return self.name 

views.py

class MontinentAutocomplete(autocomplete.Select2QuerySetView): 
    def get_queryset(self): 
     #Don't forget to filter out results depending on the visitor ! 
     if not self.request.user.is_authenticated(): 
      return Montinent.objects.none() 

     qs = Montinent.objects.all() 

     if self.q: 
      qs = qs.filter(name__istartswith=self.q) 

     return qs 

urls.py

urlpatterns = [ 
    url(r'^admin/', include(admin.site.urls)), 
    url(r'^montinent-autocomplete/$', MontinentAutocomplete.as_view(create_field='name'), name='montinent-autocomplete',), 
] 

admin.py

class MontinentForm(forms.ModelForm): 
    name = forms.ModelChoiceField(
     queryset = Montinent.objects.all(), 
     widget = autocomplete.ModelSelect2(url='montinent-autocomplete') 
    ) 

    class Meta: 
     model = Montinent 
     fields = ['name', 'slug', 'code'] 


class MontinentAdmin(admin.ModelAdmin): 
    form = MontinentForm 

admin.site.register(Montinent, MontinentAdmin) 

オートコンプリートは、新しい選択肢は以下の通りである作成方法:

ユーザーがそのオプションを選択すると、オートコンプリートのスクリプトは、ビューに POSTリクエストを行います。オブジェクトを作成して pkを返す必要があります。その場合、アイテムは既にPKを持っているかのように追加されます。

この場合、デフォルトのdjango-admin saveメソッドをオーバーライドする必要があるようです。私はちょうど '名前'フィールドを作成しようとしましたuniqueしかし、この場合Djangoはこの名前はすでにが存在すると言います。

私のmodels.py djangoのデフォルトの保存メソッドをオーバーライドして、オートコンプリートpkから返されたものを使用し、新しいオブジェクトを作成するのではなく行に不足している情報を追加する方法はありますか?

答えて

0

また、オートコンプリート作成の選択肢で複数のフィールドを埋めるのにも苦労していました。新しいエントリを作成しているユーザーを含める必要がありました。

新しいエントリをデータベースに保存する方法は、autocomplete.Select2QuerySetViewcreate_object(text)メソッドです。今、あなたは部分的にオートコンプリートを使用してフォームを埋めている必要はありません

def create_object(self, text): 
    return self.get_queryset().create(**{self.create_field: text, 'user' : self.request.user}) 

:あなたは、私はちょうど次のようにメソッドをオーバーライドし、ユーザーが含まれるように、だから、マニュアルにhttp://django-autocomplete-light.readthedocs.io/en/master/api.html

をこの方法についての詳細を読むことができますオプションを作成します。ちょうどあなたがしたいフィールドでそれを記入してください。

関連する問題