В Django, как сделать поле доступным для чтения только при первой загрузке формы? - PullRequest
0 голосов
/ 26 октября 2010

У меня есть форма модели, и мне нужно, чтобы одно из полей было доступно только для чтения, пока оно не будет сохранено.Я не нашел хороший способ сделать это, и ниже это то, что у меня есть в моем admin.py.

class RequestForm(forms.ModelForm):
    trac = forms.URLField(min_length=400, required=False)
    impacted_users = forms.ModelMultipleChoiceField(queryset=Group.objects.all(), widget=forms.CheckboxSelectMultiple)
    formfield_overrides = {
    }

    class Meta:
        model = Request

class RequestAdmin(admin.ModelAdmin):
    form = RequestForm
    list_display = ['id', 'title', 'priority', 'requestor', 'status']
    list_filter = ['requestor', 'priority', 'impacted_users']
    actions = [complete]

    class Media:
        js = (
            '/media/js/jquery.js',
            '/media/js/hide.js',
            )

    def save_model(self, request, obj, form, change):
        instance = form.save(commit=False)
        instance.requestor = request.user
        instance.save()
        form.save_m2m()
        return instance

Ответы [ 2 ]

1 голос
/ 26 октября 2010

Допустим, поле, о котором идет речь, special_field.

Вот как вы это сделаете (из этого связанного ответа ):

class RequestForm(forms.ModelForm):
    trac = forms.URLField(min_length=400, required=False)
    impacted_users = forms.ModelMultipleChoiceField(queryset=Group.objects.all(), widget=forms.CheckboxSelectMultiple)
    formfield_overrides = {
    }

    def __init__(self, special_field_starting_value=None, *args, **kwargs):
        super(RequestForm,self).__init__(*args, **kwargs)
        instance = getattr(self, 'instance', None)
        if not (instance and instance.id):
            self.fields['special_field'].widget.attrs['readonly'] = True
            self.fields['special_field'].initial = special_field_starting_value

    class Meta:
        model = Request

Этобудет работать как в режиме администратора, так и в обычном режиме.

Полное раскрытие : на самом деле я его не проверял, но, если ответ, с которым я связан, все еще действителен, то код, который янаписано на основании этого также должно быть действительным.

0 голосов
/ 26 октября 2010

Это должно быть сделано в контроллере (называемом View in Django).

В представлении, обрабатывающем вашу форму, проверьте следующую строку:

if request.method == 'POST':
    ...
else:
    ...

Это должно выглядеть как официальная документация . (Там также должен быть тест, чтобы проверить, если form.is_valid() в первой части этого if.)

Первая часть этого логического блока выполняется всякий раз, когда пользователь загружает форму не первый раз (т. Е. Недопустимые записи). Вторая часть, else, - это то, что происходит при первой загрузке формы.

Вы можете установить флажок для управления виджетом формы в соответствующем разделе этого логического блока. Обратитесь к этому посту , чтобы установить поле ввода только для чтения. В этот момент вы сможете изменить класс формы.

...