2010-08-04 22 views
30

Trang web của tôi sử dụng mô hình Người dùng xác thực người dùng của Django và mô hình UserProfile tùy chỉnh để lưu trữ một số dữ liệu bổ sung (sinh nhật, v.v.). Có cách nào để tạo ra một cái nhìn trong quản trị Django mà dệt các lĩnh vực với nhau từ cả hai mô hình người dùng và UserProfile?Django Admin: cách hiển thị các trường từ hai mô hình khác nhau trong cùng một chế độ xem?

Tôi nghi ngờ rằng đoạn mã này là thậm chí không chặt chẽ, nhưng có lẽ nó sẽ giúp minh họa những gì tôi đang cố gắng để làm: Thông điệp

from django.contrib import admin 
from django.contrib.auth.models import User 
from userprofile.models import UserProfile 


class UserProfileAdmin(admin.ModelAdmin): 
    list_display = ('name', 'gender', 'User.email') #user.email creates the error - tried some variations here, but no luck. 

admin.site.register(UserProfile, UserProfileAdmin) 

Lỗi:

ImproperlyConfigured: UserProfileAdmin.list_display [2], 'User.email' không phải là một cuộc gọi hoặc thuộc tính của 'UserProfileAdmin' hoặc được tìm thấy trong mô hình 'UserProfile'.

Cuối cùng, tôi đang cố tạo chế độ xem quản trị có & tên cuối cùng từ UserProfile và email từ Người dùng.

Trả lời

37

để hiển thị người dùng gửi email cho bạn cần phải có một phương pháp trên UserProfile hoặc UserProfileAdmin mà trả về email

trên UserProfile

def user_email(self): 
    return self.user.email 

hoặc trên UserProfileAdmin

def user_email(self, instance): 
    return instance.user.email 

sau đó thay đổi của bạn list_display để

list_display = ('name', 'gender', 'user_email') 
+1

Khá chắc chắn bạn chỉ có thể sử dụng ký hiệu gạch chân kép user__email mà không cần phải xác định hàm phụ – Hugoagogo

+1

@ Hugoagogo Thực ra bạn không thể. Đây là [vé cho nó] (https://code.djangoproject.com/ticket/5863) đóng cửa như sẽ không sửa chữa. –

+0

Rõ ràng hôm nay, nó đang sửa chữa ... Cùng một liên kết ở cuối! – HydrUra

14

Bạn có thể thử sử dụng InlineModelAdmin để hiển thị cả biểu mẫu Người dùng và UserPofile trong chế độ xem quản trị viên.

Để hiển thị thông tin hồ sơ người dùng trong danh sách thay đổi, bạn có thể tạo phương thức mới ủy quyền các giá trị từ UserProfile đến User mô hình.

Ví dụ này nên làm việc nhiều hơn hoặc ít hơn :)

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

from my_models import UserProfile 

class UserProfileInline(admin.StackedInline): 
    model = UserProfile 
    fk_name = 'user' 

class UserAdmin(admin.ModelAdmin): 
    list_display = ['get_userprofile_name', 'email'] 
    list_select_related = True 
    inlines = [ 
     UserProfileInline, 
    ] 

    def get_userprofile_name(self, instance): 
     # instance is User instance 
     return instance.get_profile().name 

admin.site.unregister(User) 
admin.site.register(User, UserAdmin) 
+0

Cảm ơn cho câu trả lời. Hóa ra rằng cái từ Ashok chính là thứ tôi cần, nhưng tôi cũng đang nhìn vào cách tiếp cận này. Cảm kích điều đó. – Joe

+0

Dành một chút thời gian với điều này - nó cũng hoạt động. Câu hỏi tiếp theo: Tôi dường như không thể truy cập một số thuộc tính được định nghĩa trên UserProfile từ UserProfileInline. Có cách nào để làm việc này không? – Joe

+1

"class UserAdmin (UserAdmin):" dòng phải được sửa là "class UserAdmin (admin.ModelAdmin):" – israkir

1

Sử dụng Ashoks đầu câu trả lời tôi đã thực hiện đoạn mã đơn giản hóa quá trình này cho số lượng lớn các lĩnh vực

class ColumnViewer(object): 
    pass 

column_list = ('name', 'surname',) 

for col in column_list: 
    setattr(ColumnViewer, col, lambda s,i : getattr(i, col)) 

@admin.register(UserProfile) 
class UserProfileAdmin(admin.ModelAdmin, ColumnViewer): 
    list_display = column_list 
Các vấn đề liên quan