2011-12-11 32 views
16

Tôi đang gặp sự cố với người dùng đã đăng nhập và một Django ModelForm. Tôi có một lớp học có tên là _Animal_ có một số ForeignKey đến User và một số dữ liệu liên quan đến động vật như tuổi tác, chủng tộc, v.v.Sử dụng request.user với Django ModelForm

Một người dùng có thể thêm động vật vào db và tôi phải theo dõi tác giả của từng con vật, vì vậy tôi cần thêm request.user được ghi lại khi người dùng tạo một phiên bản động vật.

models.py

class Animal(models.Model): 
    name = models.CharField(max_length=300) 
    age = models.PositiveSmallIntegerField() 
    race = models.ForeignKey(Race) 
    ... 
    publisher = models.ForeignKey(User) 
    def __unicode__(self): 
     return self.name 

class AnimalForm(ModelForm): 
    class Meta: 
     model = Animal 

Mục đích chính là che giấu lĩnh vực xuất bản dưới hình thức, trình người dùng đăng nhập khi chạm nút tiết kiệm.

Tôi có thể thu hút người dùng hiện tại trong chế độ xem bằng cách sử dụng initial, nhưng những gì tôi cũng muốn không hiển thị trường.

views.py

@login_required 
def new_animal(request): 
    if request.method == "POST": 
     form = AnimalForm(request.POST) 
     if form.is_valid(): 
      form.save() 
      return redirect('/') 
     else: 
      variables = RequestContext(request, {'form': form}) 
      return render_to_response('web/animal_form.html', variables) 
    else: 
     form = AnimalForm(initial={'publisher': request.user}) 
    variables = RequestContext(request, {'form': form}) 
    return render_to_response('web/animal_form.html', variables) 
+0

là 'cái User' một thể hiện của 'django.contrib.auth.models'? – shailenTJ

Trả lời

31

Bạn chỉ cần để loại trừ nó ra khỏi hình thức, sau đó đặt nó trong giao diện.

class AnimalForm(ModelForm): 
    class Meta: 
     model = Animal 
     exclude = ('publisher',) 

... và trong giao diện:.

form = AnimalForm(request.POST) 
    if form.is_valid(): 
     animal = form.save(commit=False) 
     animal.publisher = request.user 
     animal.save() 

(Cũng lưu ý rằng các else mệnh đề thứ nhất - các dòng ngay sau khi chuyển hướng - là không cần thiết Nếu bạn để nó ra, thực hiện sẽ giảm thông qua để hai dòng ở phần cuối của quan điểm, đó là giống hệt nhau)

+0

Cảm ơn Daniel rất nhiều. Hai dòng cuối cùng nên được thụt vào bằng cách này. – amb

8

Một cách khác (hơi ngắn):.
Bạn cần phải loại trừ lĩnh vực này cũng như:

class AnimalForm(ModelForm): 
    class Meta: 
     model = Animal 
     exclude = ('publisher',) 

sau đó trong giao diện:

animal = Animal(publisher=request.user) 
form = AnimalForm(request.POST, instance=animal) 
if form.is_valid(): 
    animal.save() 
Các vấn đề liên quan