2013-08-15 124 views
17

Django và stackoverflow noob tại đây. Tôi đang tạo một ứng dụng thông tin bầu cử và tôi muốn cho phép người dùng hiện đã đăng nhập có thể tự tuyên bố mình là và chỉ mình là ứng viên trong cuộc bầu cử.Ở Django, làm cách nào để đặt trường người dùng thành biểu mẫu cho người dùng hiện đã đăng nhập?

Tôi đang sử dụng Modelango và CreateView tích hợp sẵn của Django. Vấn đề của tôi là biểu mẫu Run for Office (nói cách khác, biểu mẫu 'tạo ứng viên') cho phép người dùng chọn bất kỳ người dùng nào trong cơ sở dữ liệu để tạo một ứng cử viên.

Tôi muốn trường người dùng trong Run for Office được đặt tự động cho người dùng hiện đã đăng nhập và để giá trị này bị ẩn, vì vậy người dùng đã đăng nhập không thể thay đổi giá trị của trường cho người khác .

views.py

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) 

forms.py

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

models.py

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)}) 

Cảm ơn bạn đã đọc. Tôi đã bị mắc kẹt về vấn đề này một vài ngày nay, và sẽ thực sự đánh giá cao sự giúp đỡ của bạn. Nếu bạn cần thêm thông tin, xin vui lòng cho tôi biết.

Trả lời

33
  1. Remove lĩnh vực sử dụng từ hình thức trả lại (sử dụng exclude hoặc fields, https://docs.djangoproject.com/en/dev/topics/forms/modelforms/#selecting-the-fields-to-use) lý lịch thành viên

    class CandidateForm(forms.ModelForm): 
        class Meta: 
         model = Candidate 
         exclude = ["user"] 
    
  2. Tìm và thiết lập trường người dùng trong giao diện tạo.

    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, thật dễ dàng. Tôi đã thử những thứ như "candidate.user = self.request.user" trước đây, nhưng rõ ràng là nó không hoạt động. Điều này sẽ có ích cho các hình thức khác tôi phải thực hiện, cảm ơn rất nhiều! –

+0

Tại sao ứng cử viên.user = self.request.user không hoạt động? Không phải self.request.user cũng là một đối tượng người dùng? – tilaprimera

+0

Vì self.request.user là cá thể User, nhưng Candidate.user là cá thể UserProfile. –