Câu hỏi Trong Django, làm cách nào để đặt trường người dùng ở dạng cho người dùng hiện đã đăng nhập?


Django và stackoverflow noob ở đâ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ự khai báo và chỉ mình là ứng viên trong cuộc bầu cử.

Tôi đang sử dụng Django được xây dựng trong ModelForm và CreateView. 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 cử viên') cho phép người dùng chọn bất kì người dùng 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ự động đặt thành 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 vì đã đọ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.


18
2017-08-15 04:27


gốc




Các câu trả lời:


  1. Xóa trường người dùng khỏi biểu mẫu được hiển thị (sử dụng exclude hoặc là fields, https://docs.djangoproject.com/en/dev/topics/forms/modelforms/#selecting-the-fields-to-use )

    class CandidateForm(forms.ModelForm):
        class Meta:
            model = Candidate
            exclude = ["user"]
    
  2. Tìm hồ sơ người dùng và đặt trường người dùng trong chế độ xem 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())
    

35
2017-08-15 05:53



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! - Mitch Downey
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
Vì self.request.user là cá thể User, nhưng Candidate.user là cá thể UserProfile. - nmb.ten
Cách tiếp cận này sẽ tích hợp người dùng vào chính biểu mẫu stackoverflow.com/questions/4141408/… - Igor Yalovoy
Tôi đang sử dụng hình thức giòn. Tôi phải thay đổi dòng cuối cùng thành 'return super (CanndidateCreateView, self) .form_valid (form)' để chuyển hướng hoạt động. - Jason Ching