django-admin formfield_for_ * изменить значение по умолчанию для / в зависимости от экземпляра - PullRequest
0 голосов
/ 02 июня 2010

Я пытаюсь изменить значение по умолчанию поля Foreignkey-Form для установки значения другой модели в зависимости от зарегистрированного пользователя . Но я ломаю голову над этим ...

Это: Изменение значений по умолчанию ForeignKey на сайте администратора может изменить пустую метку, но мне нужно значение по умолчанию.

#Now I tried the following without errors but it didn't had the desired effect:
class EmployeeAdmin(admin.ModelAdmin):
...
  def formfield_for_foreignkey(self, db_field, request=None, **kwargs):
    formfields= super(EmployeeAdmin, self).formfield_for_foreignkey(db_field, request, **kwargs)

    if request.user.is_superuser:
        return formfields
    if db_field.name == "company":
        #This is the RELEVANT LINE
        kwargs["initial"]  = request.user.default_company

    return db_field.formfield(**kwargs)


admin.site.register(Employee, EmployeeAdmin)

##################################################################
# REMAINING Setups if someone would like to know it but i think
# irrelevant concerning the problem
##################################################################
from django.contrib.auth.models import User, UserManager
class CompanyUser(User):
    ...
    objects = UserManager()
    company = models.ManyToManyField(Company)
    default_company= models.ForeignKey(Company, related_name='default_company')
    #I registered the CompanyUser instead of the standard User, 
    #   thats all up and working
    ...

class Employee(models.Model):
    company = models.ForeignKey(Company)
    ...

Подсказка: kwargs ["default"] ... не существует.

Заранее спасибо, Ник

Ответы [ 2 ]

2 голосов
/ 02 июня 2010

Я думаю, что метод db_field.formfield (который также вызывается администратором) всегда перезаписывает ваше начальное значение значением по умолчанию, указанным в модели! Поэтому вам нужно указать правильное поле формы самостоятельно:

from django import forms

class EmployeeAdmin(admin.ModelAdmin):
    def formfield_for_dbfield(self, db_field, **kwargs):
        user = kwargs['request'].user
        if db_field.name == "company":
            kwargs['initial'] = user.default_company
            qs = Company.objects.all()
            return forms.ModelChoiceField(queryset=qs, **kwargs)
        return super(EmployeeAdmin, self).formfield_for_dbfield(db_field, **kwargs)

Вы также можете сделать эту настройку в пользовательской форме init , но проблема в том, что вы не можете получить доступ к request обычно в классе формы, но вы можете увидеть мой хак здесь Django : Как получить текущего пользователя в административных формах о том, как получить текущий пользовательский объект в форму!

0 голосов
/ 03 июня 2010

хорошо, вещь kwargs ['initial'] работала все время, но это наплевать, если вы дадите ей объект (как я сделал с: kwargs ['initial'] = user.default_company). Но он работает с целым числом.

Я решил это так:

def formfield_for_foreignkey(self, db_field, request=None, **kwargs):
    formfields= super(EmployeeAdmin, self).formfield_for_foreignkey(db_field, request, **kwargs)

    if request.user.is_superuser:
        return formfields

    if db_field.name == "company":
        qs= request.user.company.all()
        #determine the default pos of configured default_company
        for index, item in enumerate(qs):
            if item==request.user.default_company:
                kwargs["initial"]  = index+1
                break
        #restrict shown entries in the ModelChoiceField
        kwargs["queryset"] = qs


    return db_field.formfield(**kwargs)

Извините за стресс и спасибо за помощь!

...