2010-03-10 1 views
11

Tôi muốn làm một việc như sau:Cách gán người dùng hiện đã đăng nhập làm giá trị mặc định cho trường mô hình?

class Task(models.Model): 
    ... 
    created_by = models.ForeignKey(User, **default=[LoggedInUser]** blank=True, null=True, related_name='created_by') 

Điều này có thể? Tôi không thể tìm thấy cách thích hợp để có được người dùng đăng nhập, ngoài việc làm request.user, trong một cái nhìn, mà dường như không làm việc ở đây.

PS_ Tôi nhận ra rằng tôi có thể khởi tạo dữ liệu Mô hình bằng các phương tiện khác, nhưng tôi nghĩ đây là cách sạch nhất.

+0

Xin lỗi vì tô sáng cú pháp, nhưng tôi muốn nhận xét giá trị mặc định. – Nacho

Trả lời

4

Không, bạn không thể thực hiện theo cách này. Django (và Python) có khá nhiều giá trị toàn cầu là và đó là Điều tốt (tm). Thông thường, bạn có được người dùng hiện tại trong số view(request) với request.user. Sau đó bạn có thể vượt qua điều đó như một tham số cho các phương thức/chức năng khác nhau, nhưng cố gắng thiết lập toàn cầu user sẽ chỉ dẫn đến những giọt nước mắt trong môi trường đa luồng.

Nên có hình dán bội thu cho biết, Hình ảnh toàn cầu là Ác ma. Điều này sẽ cung cấp cho bạn một ý tưởng tốt về vấn đề số một của tôi với PHP.

+0

Đủ công bằng. Tôi sẽ xem liệu tôi có thể làm cho nó hoạt động với các tín hiệu, mà tôi nghĩ rằng đó có thể là cách tốt nhất để đi sau đó. Cảm ơn – Nacho

23

Nếu bạn muốn đạt được điều này trong giao diện quản trị, bạn có thể sử dụng phương thức save_model. Xem bên dưới ví dụ:

class List(models.Model): 
    title = models.CharField(max_length=64) 
    author = models.ForeignKey(User) 

class ListAdmin(admin.ModelAdmin): 
    fields = ('title',) 
    def save_model(self, request, obj, form, change): 
     obj.author = request.user 
     obj.save() 
0

Nếu sử dụng ModelForm, nội dung sau sẽ điền giá trị mặc định cho trường đặc biệt. chẳng hạn như, chủ sở hữu đã nộp là một tiền tố cho tên của người dùng

def fillview(request): 
    instance = YourModel(owner=request.user.username) 
    form = YourModelForm(instance=instance) 

    if request.method == 'POST': 
     form = YourModelForm(request.POST, request.FILES) 
     if form.is_valid(): 
      pass 
      return render(request, 'success.html') 

    return render(request, 'fill.html', {'form': form}) 

Khi đăng nhập, bạn có thể thấy chủ sở hữu đã gửi là tên người dùng hiện tại.

+1

Cũng thấy đối số 'ban đầu' cho Biểu mẫu Django. Giải thích trong [câu trả lời này] (http://stackoverflow.com/a/604325/310441). – Owen

+0

@Owen này chính xác hơn, cảm ơn bạn đã chia sẻ điều này! – WeizhongTu