stat <linkname>
Пример:
stat /usr/local/cuda
Первые 2 строки дают:
File: '/usr/local/cuda' -> 'cuda-8.0'
Size: 8 Blocks: 0 IO Block: 4096 symbolic link
...
Это может оказаться одним из таких ограничений. Вот что мне удалось придумать. Можно создать настраиваемую форму и передать ее на сайт администратора для использования для рендеринга страницы. Однако чего я не мог добиться, так это правильного отображения начального значения. Возможно, кто-то, кто лучше разбирается в Forms, может предложить какой-нибудь uber-cool-secret-meta API, о котором я не знаю, и исправить это.
class Person(models.Model):
# ...
manager = models.ForeignKey('self', related_name='staff', null=True, blank=True)
def manager_staff(self):
return self.manager.staff.all()
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)
вы можете установить начальные значения в методе формы 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
Вот что я придумал, основываясь на ответах Т. Стоуна и 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