2013-08-15 20 views
17

Django ve stackoverflow noob burada. Bir seçim bilgisi uygulaması yapıyorum ve şu anda oturum açmış olan kullanıcının kendini seçmen olarak ve sadece ilan etmesine izin vermek istiyorum.Django'da, şu anda oturum açmış kullanıcı için kullanıcı alanını form olarak nasıl ayarlayabilirim?

Django'nun yerleşik ModelForm ve CreateView kullanıyorum. Benim sorunum, Office for Work formunun (diğer bir deyişle, 'create adayı' formunun), kullanıcının adayı oluşturmak için veritabanında herhangi bir kullanıcısını seçmesine izin vermesidir.

Office için Çalıştır alanındaki kullanıcı alanının otomatik olarak şu anda oturum açmış olan kullanıcıya ayarlanmasını istiyorum ve bu değerin gizlenmesi için, oturum açmış olan kullanıcının alanın değerini başkasına değiştirememesi . forms.py

class CandidateForm(forms.ModelForm): 
    class Meta: 
     model = Candidate 

models.py okuma için

class Candidate(models.Model): 
    user = models.ForeignKey(UserProfile) 
    office = models.ForeignKey(Office) 
    election = models.ForeignKey(Election) 
    description = models.TextField() 

    def __unicode__(self): 
     return unicode(self.user) 

    def get_absolute_url(self): 
     return reverse('candidate_detail', kwargs={'pk': str(self.id)}) 

Teşekkür

class CandidateCreateView(CreateView): 
    model = Candidate 
    form_class = CandidateForm 
    template_name = 'candidate_create.html' 

    def form_valid(self, form): 
     f = form.save(commit=False) 
     f.save() 
     return super(CandidateCreateView, self).form_valid(form) 

views.py

. Bu problemi birkaç günlüğüne taktım ve yardımın için gerçekten minnettarım. Daha fazla bilgiye ihtiyacınız varsa, lütfen biliniz. render formdan

cevap

33
  1. Kullanıcıyı kaldır alan yaratmak görünümünde

    class CandidateForm(forms.ModelForm): 
        class Meta: 
         model = Candidate 
         exclude = ["user"] 
    
  2. Bul kullanıcı profili ve set kullanıcı alanını (exclude veya fields, https://docs.djangoproject.com/en/dev/topics/forms/modelforms/#selecting-the-fields-to-use kullanarak).

    class CandidateCreateView(CreateView): 
        ... 
        def form_valid(self, form): 
         candidate = form.save(commit=False) 
         candidate.user = UserProfile.objects.get(user=self.request.user) # use your own profile here 
         candidate.save() 
         return HttpResponseRedirect(self.get_success_url()) 
    
+0

Dang, çok kolay oldu. Önceden "candidate.user = self.request.user" gibi şeyler deniyordum, ama açıkçası bu işe yaramıyor. Bu, yapmam gereken diğer formlar için kullanışlı olacak, çok teşekkürler! –

+0

Neden candidate.user = self.request.user çalışmıyor? Self.request.user bir kullanıcı nesnesi de değil mi? – tilaprimera

+0

Self.request.user Kullanıcı örneği olduğundan, ancak Candidate.user UserProfile örneğidir. –