Django Forms, установите начальное значение для request.user - PullRequest
14 голосов
/ 17 марта 2009

Есть ли какой-нибудь способ сделать следующее возможным или это должно быть сделано в другом месте?

class JobRecordForm(forms.ModelForm):
    supervisor = forms.ModelChoiceField(
        queryset    = User.objects.filter(groups__name='Supervisors'), 
        widget      = forms.RadioSelect,
        initial     = request.user # is there some way to make this possible?
    )    
    class Meta:
        model = JobRecord

Ответы [ 4 ]

30 голосов
/ 27 июля 2009

Если вы сделаете это в вашем view.py вместо:

form = JobRecordForm( initial={'supervisor':request.user} )

Тогда вы не будете запускать проверку.

См. http://docs.djangoproject.com/en/dev/ref/forms/api/#dynamic-initial-values

6 голосов
/ 05 августа 2009

Еще одно решение с Middleware и сохранение переписывания: С промежуточным программным обеспечением Вы можете вызывать «запрос» везде.


"" "Промежуточное программное обеспечение" ""

    # coding: utf-8 
from django.utils.thread_support import currentThread 
_requests = {}

def get_request():
    return _requests[currentThread()]

class GlobalRequestMiddleware(object):
    def process_request(self, request):  
        _requests[currentThread()] = request

"" "save Rewrinting" ""

class Production(models.Model):
    creator = models.ForeignKey(User, related_name = "%(class)s_creator")
    creation_date = models.DateTimeField(auto_now_add = True)
    modification_date = models.DateTimeField(auto_now = True)

    def save(self, force_insert = False, force_update = False):

        self.creator = get_request().user
        super(Production, self).save(force_insert = force_insert, force_update = force_update)
        return
6 голосов
/ 17 марта 2009

Возможно, вы захотите обработать это в вашей функции просмотра. Поскольку ваша функция просмотра должна создать начальную форму, а ваша функция просмотра знает пользователя.

form = JobRecordForm( {'supervisor':request.user} )

Это инициирует проверку этого ввода, кстати, поэтому вы не можете предоставить значения подсказок таким образом.

5 голосов
/ 18 января 2013

Для полного ответа вот решение CBV:

class MyFormView(TemplateView, FormMixin):
    def get_initial(self):
        self.initial.update({'your_field': self.request.user})
        return super(MyFormView, self).get_initial()
...