Администратор Django может обработать связь "один ко многим" через related_name?

stat <linkname>

Пример:

stat /usr/local/cuda

Первые 2 строки дают:

File: '/usr/local/cuda' -> 'cuda-8.0'
Size: 8             Blocks: 0          IO Block: 4096   symbolic link
...
11
задан Mat 7 November 2009 в 00:27
поделиться

3 ответа

Это может оказаться одним из таких ограничений. Вот что мне удалось придумать. Можно создать настраиваемую форму и передать ее на сайт администратора для использования для рендеринга страницы. Однако чего я не мог добиться, так это правильного отображения начального значения. Возможно, кто-то, кто лучше разбирается в Forms, может предложить какой-нибудь uber-cool-secret-meta API, о котором я не знаю, и исправить это.

models.py

class Person(models.Model):
    # ...
    manager = models.ForeignKey('self', related_name='staff', null=True, blank=True)

    def manager_staff(self):
        return self.manager.staff.all()

admin.py

class PersonAdminForm(forms.ModelForm):    
    manager_staff = forms.ModelMultipleChoiceField(
                        initial='manager_staff',       # Can't get this to work
                        queryset=Person.objects.all(),
                        required=False,
                        )

    class Meta:
        model = Person

class PersonAdmin(admin.ModelAdmin):    
    form = PersonAdminForm

    def save_model(self, request, obj, form, change):
        for id in form.data.getlist('manager_staff'):
            # This is kind of a weak way to do this, but you get the idea...
            p = Person.objects.get(id=id)
            p.manager = obj.manager
            p.save()

        super(PersonAdmin, self).save_model(request, obj, form, change)

admin.site.register(Person, PersonAdmin)
0
ответ дан 3 December 2019 в 11:36
поделиться

вы можете установить начальные значения в методе формы init .

Обращайтесь к ним как на self.fields ['manager_staff']. Initial.

Примерно так:

class PersonAdminForm(forms.ModelForm):    
    manager_staff = forms.ModelMultipleChoiceField(
                        queryset=Person.objects.all(),
                        required=False,
                        )

    def __init__(self, *args, **kwargs):
        super(PersonAdminForm, self).__init__(*args, **kwargs)
        if self.instance.id is not None:
            selected_items = [ values[0] for values in Person.objects.filter(
                               #whatever your filter criteria is
                              ) ]
            self.fields['manager_staff'].initial = selected_items
1
ответ дан 3 December 2019 в 11:36
поделиться

Вот что я придумал, основываясь на ответах Т. Стоуна и nicoechaniz. Исходные данные предоставляются примерно так же, как это делает nicoechaniz. Для сохранения вы должны быть осторожны, имея дело как с совершенно новым человеком, так и с редактированием существующего человека. Это то, что усложняет метод save () , зависящий от неопубликованных частей API ModelForm. На самом деле это должно быть встроено в Django. Думаю, это часто востребованная функция.

class PersonAdminForm(forms.ModelForm):
    staff = forms.ModelMultipleChoiceField(
                        queryset=Person.objects.all(),
                        required=False,
                        )
    class Meta:
        model = Person

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

        if self.instance.pk is not None:
            self.initial['staff'] = [values[0] for values in self.instance.staff.values_list('pk')]

    def save(self, commit=True):
        instance = super(PersonAdminForm, self).save(commit)

        def save_m2m():
            instance.staff = self.cleaned_data['staff']

        if commit:
            save_m2m()
        elif hasattr(self, 'save_m2m'):
            save_old_m2m = self.save_m2m

            def save_both():
                save_old_m2m()
                save_m2m()

            self.save_m2m = save_both
        else:
            self.save_m2m = save_m2m

        return instance

    save.alters_data = True

class PersonAdmin(admin.ModelAdmin):
    form = PersonAdminForm
0
ответ дан 3 December 2019 в 11:36
поделиться
Другие вопросы по тегам:

Похожие вопросы: