Задача. У вас есть две таблици, связаны друг с другом как OneToOne. Но в админке их не удобно править раздельно. Хочется это делать в одном месте. К примеру возьмем профайл и юзер. Хотя мне кажется, что профайлы в джанго — это как кость в горле. Из-за них объединение присоединение больших приложений типа формов или блогов превращается в целый геморой. Но свои соображения и идеи по этому поводу я освещу в отдельно статье.
1. Вывод записей. Решается просто вы добавляете в админ-моделе ( не знаю, как правильно назвать этот элемент джанги, ваш наследник от admin.ModelAdmin ) функцию
-
def user_name(self,obj):
-
user = obj.user
-
return u'%s %s' %(user.first_name,user.last_name)
-
user_name.short_description = u'Имя'
и в list_display строку с именем этой функции
2. Поиск. Тут все просто. В search_fields добавляем user__username
3. Фильтры. Возможно вы мне подскажите, но у меня не получилось добавить поле из связной таблици в качестве фильтра. Поэтому я просто использую в админке как «основную» – ту таблицу, в которой поля будут использоваться в качестве фильтров. Надо будет залезть в исходники с грязными ногами и выяснить, что за лажа.
4. Редактирование. Создаем отдельно форму и добавляем в ней новые поля, и переопределяем инициализацию и сохранение.
-
class ProfileForm(forms.ModelForm):
-
first_name = forms.CharField(max_length=30,label=u'Имя')
-
last_name = forms.CharField(max_length=30,label=u'Фамилия')
-
-
def __init__(self,*args,**kwargs):
-
super(ProfileForm,self).__init__(*args,**kwargs)
-
user = pr.user
-
self.initial.update({
-
'first_name':user.first_name,
-
'last_name':user.last_name
-
})
-
-
def save(self,*args,**kwargs):
-
user = self.instance.user
-
user.first_name = self.cleaned_data['first_name']
-
user.last_name = self.cleaned_data['last_name']
-
user.save()
-
return super(ProfileForm,self).save(*args,**kwargs)
-
-
class Meta:
-
model = M.StatusChatProfile
Форму передаем нашей админ-моделе.
С формой есть маленькая проблемка, на которую я наступил. В момент, когда вызывается super(…).save(…) фактическое сохрание данных еще не происходит. И это необходимо учитывать, в случае, если его “таблица напарник” при сохранении изменяет в нем же какие либо поля. Данные в этом случае перетрутся.
Спасибо за внимание. Вам успехов и удачного дня.
Recent Comments