Django Admin изменить виджет для ForeignKey
При открытии в админке модели CoinTransaction поле user представляет из себя выпадающий список. Так как пользователей около 20тыс данная страница рендерится долго. К тому-же это не единственное поле ForeignKey. Нужно заменить виджет с выпадающего списка на поле ввода, в которое можно было бы вписать User.id
Сумел сменить виджет для ForeignKey, но данные не сохраняются. Выдает ошибку вроде этой:
Cannot assign "30784": "CoinTransaction.user" must be a "User" instance
Примечание: 30784 - это ID пользователя User
models.py:
class User(AbstractUser):
"""Пользователь"""
...
def __str__(self):
return f'{self.last_name} {self.first_name}'
class Meta:
verbose_name = 'Пользователь'
verbose_name_plural = 'Пользователи'
class CoinTransaction(models.Model):
"""Монеты пользователей"""
...
user = models.ForeignKey(User, verbose_name='Пользователь', on_delete=models.CASCADE)
...
admin.py
class CoinTransactionAdminForm(forms.ModelForm):
"""Изменяем виджеты"""
user = forms.IntegerField(label='Id пользователя')
class Meta:
model = CoinTransaction
fields = '__all__'
@admin.register(CoinTransaction)
class CoinTransactionAdmin(admin.ModelAdmin):
"""Транзакции монет"""
list_display = ('id', 'user', 'amount', 'operation_type', 'order')
list_display_links = ('id', 'user',)
def get_form(self, request, obj=None, **kwargs):
"""Я не до конца понимаю смысл этого метода"""
if request.user.is_superuser:
kwargs['form'] = CoinTransactionAdminForm
return super().get_form(request, obj, **kwargs)
Ответы (1 шт):
Автор решения: svmitin
→ Ссылка
Меняем стандартный виджет на ForeignKeyRawIdWidget с помощью создания своей формы
admin.py:
from django.contrib.admin.sites import site
from django.contrib.admin.widgets import ForeignKeyRawIdWidget
class CoinTransactionAdminForm(forms.ModelForm):
"""Изменяем виджет для ForeignKey"""
class Meta:
model = CoinTransaction
widgets = {
'user': ForeignKeyRawIdWidget(CoinTransaction._meta.get_field('user').remote_field, site),
}
fields = '__all__'
@admin.register(CoinTransaction)
class CoinTransactionAdmin(admin.ModelAdmin):
"""Транзакции монет"""
list_display = ('id', 'user', 'amount', 'operation_type', 'order')
list_display_links = ('id', 'user',)
form = CoinTransactionAdminForm