私は自分のプロジェクトに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から返されたものを使用し、新しいオブジェクトを作成するのではなく行に不足している情報を追加する方法はありますか?