2009-03-17 25 views
13

Có cách nào để thực hiện những điều sau đây có thể không hoặc nên thực hiện ở nơi khác?Các biểu mẫu Django, đặt giá trị ban đầu thành request.user

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 

Trả lời

6

Bạn có thể muốn xử lý điều này trong chức năng chế độ xem của mình. Vì chức năng xem của bạn phải tạo biểu mẫu ban đầu và chức năng xem của bạn biết người dùng.

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

Điều này sẽ kích hoạt xác thực đầu vào này, BTW, vì vậy bạn không thể cung cấp giá trị gợi ý theo cách này.

5

Một Một giải pháp với Middleware và lưu viết lại: Với giải pháp middleware Bạn có thể gọi là "yêu cầu" ở khắp mọi nơi.


"" "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 
+0

Tôi có phải nhập bất cứ thứ gì để sử dụng phương thức 'get_request()' này không? – Throoze

+0

những gì được lưu trữ trong '_request [currentThread()]'? nó là một tham chiếu đến đối tượng 'request' hay giá trị của nó? những gì tôi thực sự muốn biết là: Liệu bất kỳ thay đổi nào sau này được thực hiện (ví dụ như các phần mềm trung gian khác) có được phản ánh trên đó không? trong trường hợp không, nó sẽ không tốt hơn để lưu trữ nó trong phương thức 'process_view()', trong phần mềm trung gian? Cảm ơn bạn đã trả lời! – Throoze

5

Đối với một câu trả lời hoàn chỉnh, đây là giải pháp CBV:

class MyFormView(TemplateView, FormMixin): 
    def get_initial(self): 
     self.initial.update({'your_field': self.request.user}) 
     return super(MyFormView, self).get_initial() 
Các vấn đề liên quan