2012-04-03 44 views
11

Làm cách nào tôi có thể đặt giá trị ban đầu của trường trong biểu mẫu được tạo tự động để thêm thể hiện mô hình Django, trước khi biểu mẫu được hiển thị? Tôi đang sử dụng Django 1.3.1.Làm thế nào để thiết lập dữ liệu ban đầu cho mô hình quản trị Django thêm mẫu thể hiện?

mô hình của tôi là như sau:

class Foo(models.Model): 
    title = models.CharField(max_length=50) 
    description = models.TextField() 

và hình thức quản trị hiện tại thực sự là không có gì đặc biệt

class FooAdmin(admin.ModelAdmin): 
    ordering = ('title',) 

Khi tôi sử dụng trang quản trị để thêm một trường hợp mới của Foo, tôi nhận được một hình thức tốt đẹp với các trường trống cho tiêu đề và mô tả. Những gì tôi muốn là trường mô tả được thiết lập với một mẫu mà tôi có được bằng cách gọi một hàm.

nỗ lực tốt nhất hiện tại của tôi lúc nhận được ở đó là thế này:

def get_default_content(): 
    return 'this is a template for a Foo description' 

class FooAdminForm(django.forms.ModelForm): 

    class Meta: 
     model = Foo 

    def __init__(self, *args, **kwargs): 
     kwargs['initial'].update({'description': get_default_content()}) 
     super(FooAdminForm, self).__init__(self, *args, **kwargs) 

class FooAdmin(admin.ModelAdmin): 
    ordering = ('title',) 
    form = FooAdminForm 

nhưng nếu tôi cố gắng này, tôi nhận được lỗi Django này:

AttributeError at /admin/bar/foo/add/ 
    'FooForm' object has no attribute 'get' 
Request Method: GET 
Request URL: http://localhost:8000/admin/bar/foo/add/ 
Django Version: 1.3.1 
Exception Type: AttributeError 
Exception Value: 'FooForm' object has no attribute 'get' 
Exception Location: /www/django-site/venv/lib/python2.6/site-packages/django/forms/widgets.py in value_from_datadict, line 178 

Tôi không biết những gì là sai ở đây, và những gì tôi nên làm để làm cho nó hoạt động. Những gì tôi cũng thấy lạ về lỗi này (ngoài thực tế là tôi thấy nó ở tất cả) là không có FooForm trong mã của tôi ở tất cả?

Trả lời

17

Bạn cần phải bao gồm self làm đối số đầu tiên trong định nghĩa phương thức __init__ của mình, nhưng không được bao gồm khi bạn gọi phương thức của lớp cha.

def __init__(self, *args, **kwargs): 
    # We can't assume that kwargs['initial'] exists! 
    if not kwargs.get('initial'): 
     kwargs['initial'] = {} 
    kwargs['initial'].update({'description': get_default_content()}) 
    super(FooAdminForm, self).__init__(*args, **kwargs) 

Có trường mẫu có thể gọi được cho số default, vì vậy bạn không cần phải xác định biểu mẫu quản trị viên tùy chỉnh.

class Foo(models.Model): 
    title = models.CharField(max_length=50) 
    description = models.TextField(default=get_default_content) 
+0

Wow, mà làm việc như một nét duyên dáng! Thông điệp khó hiểu khủng khiếp bằng cách cho một sai lầm ngớ ngẩn như vậy ... Cảm ơn rất nhiều sự giúp đỡ của bạn! –

+0

Nhân tiện, tôi cũng đã thử đề xuất thứ hai của bạn thành công, thậm chí còn sạch hơn, vì vậy cảm ơn bạn một lần nữa! –

+0

Tôi thấy rằng cài đặt kwargs ['initial'] gây ra lỗi khi lưu biểu mẫu. Tôi đã đặt một mệnh đề if: nếu 'ban đầu' bằng kwargs.keys(): kwargs ['initial']. ( Điều này làm việc để hiển thị giá trị ban đầu và cập nhật chúng. – Sven

7

Hơn 3 năm sau, Nhưng trên thực tế những gì bạn cần làm là ghi đè admin.ModelAdmin formfield_for_dbfield .. như thế này:

class FooAdmin(admin.ModelAdmin): 
    def formfield_for_dbfield(self, db_field, **kwargs): 
     field = super(FooAdmin, self).formfield_for_dbfield(db_field, **kwargs) 
     if db_field.name == 'description': 
      field.initial = 'My initial description' 
     elif db_field.name == 'counter': 
      field.initial = get_counter() + 1 
     return field 

Cheers;

+0

Rất đẹp. Thật lạ lùng nhưng không có điều gì trong tài liệu: https: // docs. djangoproject.com/en/1.8/ref/contrib/admin/ – Wtower

+0

Quản trị Django là "cách" không được ghi chép, thật không may. –

15

Cách tiếp cận của Alasdair là tốt đẹp nhưng đã lỗi thời. Cách tiếp cận của Radev trông khá đẹp và như đã đề cập trong phần bình luận, nó đánh tôi rằng không có gì về điều này trong tài liệu.

Ngoài những vì Django 1,7 có một chức năng get_changeform_initial_data trong ModelAdmin mà bộ giá trị hình thức ban đầu:

def get_changeform_initial_data(self, request): 
    return {'name': 'custom_initial_value'} 
+0

vì một lý do nào đó trong 1.10.2 phương pháp này không được gọi ở tất cả, mặc dù nó có trong tài liệu – scythargon

+0

@scythargon Tôi vừa thử nghiệm nó trong 1.10.2 và cho tôi nó đã làm việc như được ghi lại. – Wtower

+0

Thật dễ dàng để mất dấu vết của tất cả các móc có sẵn cho ModelAdmin. Cám ơn vì cái này! –

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