2014-09-08 20 views
5

Tôi đang sử dụng các mô hình Django để tạo các trường cho biểu mẫu. Tôi muốn tên người dùng được tự động phát hiện và được điền vào, theo cách này tôi có thể ẩn nó trong biểu mẫu của tôi (thay vì yêu cầu họ chọn tên người dùng của họ từ danh sách dài có tên người dùng). Để thực hiện việc này, tôi đang sử dụng:request.user trong mô hình Django

current_user = request.user 

và sau đó đặt mặc định thành current_user. Tuy nhiên, tôi vẫn gặp phải lỗi này:

NameError: name 'request' is not defined 

Tôi giả sử bạn không thể sử dụng yêu cầu trong các mô hình Django, nhưng có cách nào để khắc phục sự cố này không? Dưới đây là các phần có liên quan trong tệp models.py của tôi:

class StockTickerSymbol(models.Model): 
    StockName = models.CharField(max_length=7, unique=True) 
    current_user = request.user 
    user = models.ForeignKey(User, default=current_user) 

Bất kỳ ai biết cách tôi có thể sử dụng yêu cầu trong mô hình của mình hoặc bằng cách nào đó gọi biến current_user?

+0

liên quan hoặc trùng lặp: [làm cho người sử dụng trong một mặc định mô hình cho người dùng hiện tại ] (http://stackoverflow.com/questions/4670783/make-the-user-in-a-model-default-to-the-current-user). – alecxe

+1

Bạn không thể sử dụng * bất cứ thứ gì *, ở bất kỳ đâu trong Python, trừ khi nó được chuyển cho nó bằng cách nào đó. –

Trả lời

5

Tại đây bạn chưa nhập yêu cầu trong phạm vi lớp mô hình đó. Đây là cách bạn có thể nhận được sử dụng:

class StockTickerSymbol(models.Model): 
    StockName = models.CharField(max_length=7, unique=True) 
    user = models.ForeignKey(User) 

    def save(self,**kwargs): 
     if kwargs.has_key('request') and self.user is None: 
      request = kwargs.pop('request') 
      self.user= request.user 
     super(StockTickerSymbol, self).save(**kwargs) 

#views: 
     def post(self, request): 
      if form.is_valid():       
       sts=StockTickerSymbol() 
       sts.StockName= form.cleaned_data['StockName'] 
       if form.cleaned_data['user'] is None: #null check 
        sts.save(request=request) 
       else: 
        sts.user= form.cleaned_data['user'] 
        sts.save(request=request) 

Đối ModelForm:

class SomeForm(forms.ModelFOrm): 
     .... 


    def save(self, commit=True ,*args, **kwargs): 
      request = None 
      if kwargs.has_key('request'): 
       request = kwargs.pop('request') 
      m = super(SomeForm, self).save(commit=False, *args, **kwargs) 
      if m.user is None and request is not None: 
       m.user= request.user 
       m.save() 

trong quan điểm:

def post(self, request): 
     if form.is_valid(): 
      form.save(request=request) 
      return .... 
+0

Ok, tôi đã thêm bit 'def save' vào models.py của mình, nhưng tôi không hoàn toàn chắc chắn nơi sẽ thêm mã lượt xem. [Ở đây] (http://pastebin.com/4RJ4Adjc) là tệp view.py có liên quan của tôi. Mã sẽ chính xác ở đâu? – ng150716

+0

Tôi đã cập nhật câu trả lời của mình. @nawawaz – ruddra

+0

rất hữu ích, cảm ơn - các yêu cầu cần thiết để thiết lập một 'tin nhắn' .. mặc dù có lẽ tôi nên làm điều đó trong' post_save' anyway ... – ptim

Các vấn đề liên quan