2012-03-02 17 views
7

Trong lớp UpdateView cơ sở ở Django, tôi loại trừ trường người dùng vì nó nằm trong hệ thống và tôi sẽ không yêu cầu. Bây giờ cách Django thích hợp để đưa người dùng vào biểu mẫu là gì. (Làm thế nào tôi làm điều đó bây giờ, là tôi vượt qua người dùng vào init của mẫu và sau đó ghi đè phương thức save() của biểu mẫu.Nhưng tôi đặt cược rằng có một cách thích hợp để làm điều này. . điều của thiên nhiên màchế độ xem dựa trên lớp django - UpdateView - Cách truy cập người dùng yêu cầu trong khi xử lý biểu mẫu?

# models.py 
class Entry(models.Model): 
    user = models.ForeignKey(
       User, 
       related_name="%(class)s", 
       null=False 
    ) 

    name = models.CharField(
       blank=False, 
       max_length=58, 
    ) 

    is_active = models.BooleanField(default=False) 

    class Meta: 
     ordering = ['name',] 

    def __unicode__(self): 
     return u'%s' % self.name 

# forms.py 
class EntryForm(forms.ModelForm): 
    class Meta: 
     model = Entry 
     exclude = ('user',) 

# views.py 
class UpdateEntry(UpdateView): 
    model = Entry 
    form_class = EntryForm 
    template_name = "entry/entry_update.html" 
    success_url = reverse_lazy('entry_update') 

    @method_decorator(login_required) 
    def dispatch(self, *args, **kwargs): 
     return super(UpdateEntry, self).dispatch(*args, **kwargs) 

# urls.py 
url(r'^entry/edit/(?P<pk>\d+)/$', 
    UpdateEntry.as_view(), 
    name='entry_update' 
), 

Trả lời

7

Hacking xung quanh như đi qua một lĩnh vực tiềm ẩn không có ý nghĩa như thế này thực sự không có gì để làm với khách hàng - "liên kết với người dùng đăng nhập" này classic vấn đề chắc chắn phải được xử lý trên phía máy chủ

Tôi muốn đặt hành vi này theo phương thức form_valid.

class MyUpdateView(UpdateView): 
    def form_valid(self, form): 
     instance = form.save(commit=False) 
     instance.user = self.request.user 
     super(MyUpdateView, self).save(form) 

    # the default implementation of form_valid is... 
    # def form_valid(self, form): 
    #  self.object = form.save() 
    #  return HttpResponseRedirect(self.get_success_url()) 
+3

Tôi khuyên bạn nên xóa hai dòng cuối cùng ('.save()' và 'return') và thay thế chúng bằng' super (MyUpdateView, self) .form_valid (form) '. Điều này sẽ chỉ thực thi form_valid() (giống hệt với hai dòng cuối cùng của bạn) khi thể hiện mẫu đã sửa đổi của bạn, giữ cho mã của bạn đồng bộ với bất kỳ thay đổi nào trong tương lai mà dự án Django tạo ra cho phương thức này. – Bryson

+0

@Bryson, đẹp quá! Tôi đã thực sự không bao giờ làm điều đó trước đây. Tôi cho rằng nó không trực quan ngay lập tức mà cá thể được tham chiếu trên form.instance và do đó thay đổi ảnh hưởng đến tương lai save() gọi lại. –

+0

Điều tôi đã bỏ lỡ: thay vì chỉ sử dụng 'instance =' tôi tin bạn nên sử dụng 'form.instance ='. Điều này sẽ thêm người dùng từ đối tượng yêu cầu (giả sử biểu mẫu của bạn đã được tạo với trường này, nếu không nó sẽ lỗi giống như "Biểu mẫu không có thuộc tính" người dùng "") thành cá thể biểu mẫu, sau đó sẽ được trả về thông qua ' super() '. Vì nó được viết ngay bây giờ, biểu mẫu đã sửa đổi với dữ liệu người dùng được lưu trong một biến gọi là 'instance' không bao giờ rời khỏi phiên bản' form_valid', vì vậy vì bạn đã chuyển sang 'super()', nó không bao giờ được lưu lại. Xin lỗi nó đã phức tạp. haha – Bryson

2

Phải trả lại đối tượng HttpResponse. Mã bên dưới hoạt động:

class MyUpdateView(UpdateView): 
    def form_valid(self, form): 
     instance = form.save(commit=False) 
     instance.user = self.request.user 
     return super(MyUpdateView, self).form_valid(form) 
Các vấn đề liên quan