2012-02-21 20 views
6

Tôi đang sử dụng một bộ định dạng với can_delete = True. Tôi muốn thay đổi tiện ích của trường DELETE thành đầu vào bị ẩn. Tôi dường như không thể tìm ra cách tốt để làm điều này. Những gì tôi đã cố gắng là:Làm cách nào để thay đổi loại tiện ích con của trường DELETE trong một tập hợp django

Thay đổi phụ tùng của hình thức để HiddenInput và/hoặc thêm một lĩnh vực tiềm ẩn trong định nghĩa hình thức:

class MyForm(ModelForm): 
    DELETE = forms.BooleanField(widget=forms.HiddenInput) 

    class Meta: 
     model = MyModel 
     widgets = {'DELETE' : forms.HiddenInput} 

Làm ở trên với một sự thay đổi trong formset

class MyFormSet(BaseModelFormSet): 

def add_fields(self, form, index): 
    originalDeletion = None 
    if DELETION_FIELD_NAME in form.fields: 
     originalDeletion = form.fields[DELETION_FIELD_NAME] 

    super(MyFormSet, self).add_fields(form,index) 

    if originalDeletion is not None: 
     form.fields[DELETION_FIELD_NAME] = originalDeletion 

Nếu tôi thực hiện cả hai, nó thực sự thay đổi trường để ẩn nhưng điều này có vẻ như một chút của một hack (có hiệu quả ghi đè lên phương pháp add_fields thông thường). Làm thế nào bạn có nghĩa vụ phải làm điều này?

== EDIT ==

Hóa ra, việc sử dụng trường ẩn không tốt với khung biểu mẫu. Bạn chắc chắn nên sử dụng một hộp kiểm và ẩn nó với css. Nếu bạn muốn làm điều chỉnh css của hộp kiểm trong Django tôi vẫn nghĩ rằng bạn phải thay đổi phương thức add_fields như trên, mà sau đó cho phép bạn thay đổi css của widget.

+0

Tại sao nó ** đã ** là có type = ẩn? Không phải là những cách khác để che giấu nó tốt sao? – jpic

Trả lời

10

Nó không thay đổi bất cứ điều gì nếu đầu vào của bạn là loại = ẩn, hoặc nếu nó là loại = hộp kiểm display: none.

IMHO cách thanh lịch trong CSS sẽ trông như thế này:

td.delete input { display: none; } 

Hoặc trong JavaScript:

$('td.delete input[type=checkbox]').hide() 

Hoặc, trong admin:

django.jQuery('td.delete input[type=checkbox]').hide() 

Điều đó có vẻ giống như một hướng tốt hơn để thực hiện vì:

  1. sẽ không thay đổi mã JavaScript của bạn
  2. Đó là một dòng mã vs rất nhiều Python hacks
+0

Ah - vì vậy bạn ẩn nó trong javascript/css. Điều đó có ý nghĩa. Vẫn có vẻ kỳ lạ không có cách nào để làm điều này trực tiếp trong django - Tôi đoán tương đương sẽ được thêm một lớp css cho các widget mà giấu nó. Có vẻ như bạn không thể làm điều đó mặc dù vì nó không cho phép bạn ghi đè lên tiện ích DELETE. – Blaise

20

Mã ngắn nhất để thực hiện những gì bạn cần là:

class MyFormSet(BaseFormSet): 
    def add_fields(self, form, index): 
     super(MyFormSet, self).add_fields(form, index) 
     form.fields[DELETION_FIELD_NAME].widget = forms.HiddenInput() 

Nó không thể được coi là một hack vì nó được đề cập trong tài liệu chính thức Django:

https://docs.djangoproject.com/en/1.4/topics/forms/formsets/#adding-additional-fields-to-a-formset

nguồn Django để đọc:

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