2014-09-08 11 views
5

Używam modeli Django do tworzenia pól dla formularza. Chciałbym, aby nazwa użytkownika użytkownika została automatycznie wykryta i wypełniona, w ten sposób mogę ukryć ją w moim formularzu (zamiast wybierać nazwę użytkownika z długiej listy zawierającej nazwę użytkownika). Aby to zrobić, używam:request.user w Django model

current_user = request.user 

a następnie ustawienie domyślne na current_user. Jednak wciąż otrzymuję ten błąd:

NameError: name 'request' is not defined 

Zakładam, że nie można korzystać z żądań w modelach Django, ale jest tam mimo to obejść? Oto odpowiednie odcinki mojego models.py pliku:

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

ktoś wie jak mogę wykorzystać wnioski w moich modelach, czy jakoś nazwać zmienną current_user?

+0

Pokrewne lub duplikat: [wprowadzać użytkownika w domyślnym modelu do bieżącego użytkownika ] (http://stackoverflow.com/questions/4670783/make-the-user-in-a-model-default-to-the-current-user). – alecxe

+1

Nie można w ogóle używać * niczego *, w dowolnym miejscu w Pythonie, chyba że jest w jakiś sposób przekazany do niego. –

Odpowiedz

5

Tutaj nie zaimportowano żądania w zakresie modelu tej klasy. W ten sposób można uzyskać użytkownika:

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) 

Dla 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() 

w widokach:

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

Ok, dodałem bit 'def save' do mojego modelu .ps, ale nie jestem do końca pewien, gdzie dodać kod widoków. [Tutaj] (http://pastebin.com/4RJ4Adjc) to mój odpowiedni plik views.py. Gdzie dokładnie będzie ten kod? – ng150716

+0

Zaktualizowałem moją odpowiedź. @Nawawaz – ruddra

+0

bardzo pomocny, dziękuję - potrzebne żądania, aby ustawić 'wiadomość' .. choć może powinienem to robić w' post_save' tak czy inaczej ... – ptim