Исключая поле формы, но добавляя его обратно с помощью clean () - PullRequest
0 голосов
/ 31 октября 2010

В админке django у меня есть встроенная строка, в которую я хочу, чтобы пользователь, выполняющий просмотр, заполнялся автоматически.Во время функции clean она заполняет поле created_by значением request.user.Проблема в том, что поскольку поле created_by исключено формой, значение, которое вставляется в cleaned_fields, по-видимому, игнорируется.Как я могу это сделать?Я хочу, чтобы виджет вообще не отображался.

class NoteInline(admin.TabularInline):
    model = Note
    extra = 1
    can_delete = False

    def get_formset(self, request, obj=None, **kwargs):
        """
        Generate a form with the viewing CSA filled in automatically
        """

        class NoteForm(forms.ModelForm):

            def clean(self):
                self.cleaned_data['created_by'] = request.user
                return self.cleaned_data

            class Meta:
                exclude = ('created_by', )
                model = Note
                widgets = {'note': forms.TextInput(attrs={'style': "width:80%"})}

        return forms.models.inlineformset_factory(UserProfile, Note,
                                                  extra=self.extra,
                                                  form=NoteForm,
                                                  can_delete=self.can_delete)

Ответы [ 2 ]

2 голосов
/ 31 октября 2010

ОРИГИНАЛЬНОЕ ПРЕДЛОЖЕНИЕ:

Почему бы просто не оставить поле на месте, а не исключить его, а затем сделать его скрытым?

Класс NoteForm (forms.ModelForm):

def __init__(*args, **kwargs):
   super(NoteForm, self).__init__(*args, **kwargs)

   self.fields['created_by'].widget = forms.widgets.HiddenInput()


#rest of your form code follows, except you don't exclude 'created_by' any more    

SUGGESTION # 2 (поскольку скрытое поле по-прежнему отображается в заголовке столбца во встроенном файле):

Не устанавливать self.cleaned_data ['made_by'] в методе clean () вообще,Вместо этого переопределите NoteForm.save () и установите его там.

(Либо передайте запрос на сохранение (), если вы можете, либо кэшируйте его в init, добавив его к self, либо используйте его как переменную уровня класса, как вы, кажется, уже делаете.)

0 голосов
/ 05 ноября 2010

Мое решение состояло в том, чтобы отредактировать функцию formfield_for_foreignkey для Inline, которая ограничивала выпадающий список только зарегистрированным пользователем.

class NoteInline(admin.TabularInline):
    model = Note
    extra = 1
    can_delete = False

    def queryset(self, request):
        return Note.objects.get_empty_query_set()

    def formfield_for_foreignkey(self, db_field, request, **kwargs):
        if db_field.name == 'created_by':
            # limit the 'created_by' dropdown box to just the CSR user who is
            # logged in and viewing the page.
            kwargs['queryset'] = User.objects.filter(pk=request.user.pk)
        return super(NoteInline, self).formfield_for_foreignkey(db_field, request, **kwargs)
...