2011-01-12 36 views
6

Tôi đã điều sau đây:làm cho người sử dụng trong một mặc định mô hình để người dùng hiện

from django.contrib.auth.models import User 

class ClientDetails(models.Model): 
    created_by = models.ForeignKey(User) 
    ... 

Làm thế nào để làm cho created_by mặc định để hiện đang đăng nhập sử dụng?

(Tôi muốn làm điều này vì vậy tôi có thể giấu nó trong giao diện quản trị chủ yếu mà còn vì khi tôi tiết kiệm một thể hiện tôi không muốn được làm đầy nó mỗi thời gian)

Trả lời

12

Vì bạn cần phải nhận được hiện đang đăng nhập người dùng từ một đối tượng request bạn không thể có được nó trong save -method của mô hình, nhưng bạn có thể ví dụ như ghi đè save_model -method mô hình của admin:

class MyAdmin(admin.ModelAdmin): 
    def save_model(self, request, instance, form, change): 
     user = request.user 
     instance = form.save(commit=False) 
     if not change or not instance.created_by: 
      instance.created_by = user 
     instance.modified_by = user 
     instance.save() 
     form.save_m2m() 
     return instance 
+1

tôi có thể chỉ cần thả điều này trong một trong số các chế độ xem quản trị viên của mình? (rõ ràng là sau khi thay đổi created_by và modified_by). Bất kỳ cơ hội nào bạn có thể phá vỡ điều này cho chúng tôi? – Sevenearths

+0

đây là giải pháp hữu ích nhất, bởi vì bạn có thể sử dụng "yêu cầu", không thể tin rằng tôi bị mất nó ở đây http://django.me/save_model – tutuDajuju

1

modelfields Bình thường có một đối số mặc định. Nhưng ForeignKeys không xa như tôi biết, vì vậy tôi đoán bạn cần phải làm việc với một tín hiệu post_save.

+0

+1, nhưng nếu là tôi, tôi sẽ chỉ ghi đè lên hàm save() :) – mouad

+0

Sau đó, tôi sẽ phải ghi đè lên chức năng lưu mặc định của quản trị viên sẽ không? – Sevenearths

+0

Phiên bản hiện tại của Django chắc chắn cho phép mặc định cho các phím nước ngoài. Tôi không chắc chắn rằng họ đã không bao giờ. Vì vậy, nếu bất cứ ai đến và đọc trả lời này ngày hôm nay, tốt nhất nó nên được xem xét ra ngày. –

1

tôi thấy:

from django.db import models 
from django.contrib.auth.models import User 

class CurrentUserField(models.ForeignKey): 
    def __init__(self, **kwargs): 
     super(CurrentUserField, self).__init__(User, null=True, **kwargs) 

    def contribute_to_class(self, cls, name): 
     super(CurrentUserField, self).contribute_to_class(cls, name) 
     registry = registration.FieldRegistry() 
     registry.add_field(cls, self) 

class ClientDetails(models.Model): 
    created_by = CurrentUserField() 
... 

từ here. Nhưng không phải là một cách dễ dàng hơn?

+0

+ Tôi không biết cách nhập 'đăng ký ' – Sevenearths

+0

Bạn nên đọc thêm sách, bạn càng cần nhiều, bao gồm đăng ký và phần mềm trung gian! –

+0

có lẽ bạn phải – Sevenearths

6

tôi đã một vấn đề tương tự gần đây, đây là từ tập tin views.py tôi

def CircleAdd(request): 

    form = CircleAddForm(request.POST) 

    if form.is_valid(): 

     Circle = form.save(commit=False) 
     Circle.Author = request.user 
     Circle = Circle.save() 

Và sau đó tôi đã có một hình thức cho mô hình 'vòng kết nối', mà chỉ là một wrapper thực sự (forms.py)

class CircleAddForm(ModelForm): 
    class Meta: 
     model = Circle 

Hãy nhớ nhập biểu mẫu trong chế độ xem của bạn!

Edit: thậm chí không chắc chắn nếu bạn thậm chí không cần phải bận tâm với hình thức riêng biệt, các bit quan trọng là giả mạo phạm, tiếp theo là thực

+0

không chắc chắn những gì forms.py là (vẫn còn mới để django) tôi tôi chỉ hy vọng làm điều này trong giao diện quản trị – Sevenearths

+0

Tôi giả sử nếu tôi có thể đặt mặc định trong models.py thì nó sẽ mặc định trong dạng xem quản trị và trang web cũng như – Sevenearths

+0

trên biểu mẫu ngay bây giờ và câu trả lời của bạn hiện có ý nghĩa – Sevenearths

3

Dựa trên câu trả lời được chấp nhận, nếu bạn đang tìm kiếm để làm điều này với tầm lớp Dựa, bạn có thể làm theo các hướng dẫn trong docs, trọng phương pháp form_valid() trên quan điểm lớp:

# views.py 

from django.views.generic.edit import CreateView 

class CreateClient(CreateView): 
    def form_valid(self, form): 
     form.instance.created_by = self.request.user 
     return super(CreateClient, self).form_valid(form) 
+0

Lưu ý rằng thao tác này không hoạt động nếu trường là trường bắt buộc. – YPCrumble

4

bạn cần phải ghi đè get_changeform_initial_data phương thức trong lớp quản lý mô hình của bạn trong admin.py như sau:

# admin.py 

class ClientDetailsAdmin(admin.ModelAdmin): 
    def get_changeform_initial_data(self, request): 
     get_data = super(ClientDetailsAdmin, self).get_changeform_initial_data(request) 
     get_data['created_by'] = request.user.pk 
     return get_data 

admin.site.register(ClientDetails, ClientDetailsAdmin) 

Bằng cách đó bạn có được giải pháp thanh lịch nhất kể từ khi trường created_by được đệ trình khi bạn tạo bản ghi mới.

Các vấn đề liên quan