Я новичок в django, поэтому, пожалуйста, не стесняйтесь сказать мне, если я делаю это неправильно. Я пытаюсь создать систему заказов Django. Модель моего заказа:
class Order(models.Model):
ordered_by = models.ForeignKey(User, limit_choices_to = {'groups__name': "Managers", 'is_active': 1})
в моем админе ЛЮБОЙ пользователь может ввести заказ, но order_by должен быть кем-то из группы "менеджеры" (это поведение, которое я хочу).
Теперь, если вошедший в систему пользователь оказался менеджером, я хочу, чтобы он автоматически заполнил поле тем, кто вошел в систему. Я достиг этого путем:
class OrderAdmin(admin.ModelAdmin):
def formfield_for_foreignkey(self, db_field, request, **kwargs):
if db_field.name == "ordered_by":
if request.user in User.objects.filter(groups__name='Managers', is_active=1):
kwargs["initial"] = request.user.id
kwargs["empty_label"] = "-------------"
return db_field.formfield(**kwargs)
return super(OrderAdmin, self).formfield_for_foreignkey(db_field, request, **kwargs)
Это также работает, но администратор по умолчанию помещает имя пользователя в качестве дисплея для поля выбора. Было бы неплохо, чтобы в списке было настоящее имя пользователя. Я смог сделать это с этим:
class UserModelMultipleChoiceField(forms.ModelMultipleChoiceField):
def label_from_instance(self, obj):
return obj.first_name + " " + obj.last_name
class OrderForm(forms.ModelForm):
ordered_by = UserModelChoiceField(queryset=User.objects.all().filter(groups__name='Managers', is_active=1))
class OrderAdmin(admin.ModelAdmin):
form = OrderForm
Моя проблема: я не могу с обоими из них. Если я добавлю функцию formfield_for_foreignkey и добавлю form = OrderForm, чтобы использовать мой пользовательский «UserModelChoiceField», он отобразит красивое имя, но не выберет вошедшего в систему пользователя. Я новичок в этом, но я предполагаю, что когда я использую UserModelChoiceField, он «стирает» информацию, переданную через formfield_for_foreignkey. Нужно ли как-то использовать функцию super () для передачи этой информации? или что-то совсем другое?