Уведомления

Группа в Telegram: @pythonsu
  • Начало
  • » Django
  • » ForeignKey в админке выбрать автоматически [RSS Feed]

#1 Окт. 14, 2011 20:06:35

apologize828
От:
Зарегистрирован: 2010-02-13
Сообщения: 223
Репутация: +  1  -
Профиль   Отправить e-mail  

ForeignKey в админке выбрать автоматически

Допустим есть любая модель, ну например такая:

# models.py
from django.db import models
from django.utils.translation import ugettext_lazy as _
from django.contrib.auth.models import User

class Test(models.Model):
user = models.ForeignKey(User, verbose_name=_('user'))
text = models.CharField(_('text'), max_length=100)

def __unicode__(self):
return self.text
и
#admin.py
from django.contrib import admin
from test_app.models import Test

class TestAdmin(admin.ModelAdmin):
list_display = ('user', 'text', )
search_fields = ['text', ]

admin.site.register(Test, TestAdmin)
Вопрос такой: Теперь если я захожу в админку под определенным пользователем(user) и хочу добавить новый test, то появляется форма добавления c двумя полями: User(выпадающий список) и Text(текстовое поле) как сделать так чтобы в поле User автоматом выбирался пользователь под которым я зашел в админку и самому не выбирать это?



Офлайн

#2 Окт. 17, 2011 10:20:36

pill
От:
Зарегистрирован: 2010-08-27
Сообщения: 223
Репутация: +  0  -
Профиль   Отправить e-mail  

ForeignKey в админке выбрать автоматически

Имхо, проще всего свою кастомную форму прицепить:
https://docs.djangoproject.com/en/dev/ref/contrib/admin/#adding-custom-validation-to-the-admin
А тут обсуждали как в админформе достать юзера:
http://stackoverflow.com/questions/2864955/django-how-to-get-current-user-in-admin-forms

Тобишь будет что-то вроде:

# форма
class TestAdminForm(forms.ModelForm):
class Meta:
model = Test
exclude = ['user',]

def save(self, commit=True, *args, **kwargs):
inst = super(self.__class__, self).save(commit=False)
inst.user = self.current_user
if commit:
inst.save()
return inst

# admin.py
class TestAdmin(admin.ModelAdmin):
list_display = ('user', 'text', )
search_fields = ['text', ]
form = TestAdminForm

def get_form(self, request, obj=None, **kwargs):
form = super(self.__class__, self).get_form(request, obj, **kwargs)
form.current_user = request.user
return form
Код не тестил, могут быть ляпы :)



Отредактировано (Окт. 17, 2011 10:49:46)

Офлайн

#3 Окт. 17, 2011 22:00:08

apologize828
От:
Зарегистрирован: 2010-02-13
Сообщения: 223
Репутация: +  1  -
Профиль   Отправить e-mail  

ForeignKey в админке выбрать автоматически

pill
Имхо, проще всего свою кастомную форму прицепить:
https://docs.djangoproject.com/en/dev/ref/contrib/admin/#adding-custom-validation-to-the-admin
А тут обсуждали как в админформе достать юзера:
http://stackoverflow.com/questions/2864955/django-how-to-get-current-user-in-admin-forms

Тобишь будет что-то вроде:

# форма
class TestAdminForm(forms.ModelForm):
class Meta:
model = Test
exclude = ['user',]

def save(self, commit=True, *args, **kwargs):
inst = super(self.__class__, self).save(commit=False)
inst.user = self.current_user
if commit:
inst.save()
return inst

# admin.py
class TestAdmin(admin.ModelAdmin):
list_display = ('user', 'text', )
search_fields = ['text', ]
form = TestAdminForm

def get_form(self, request, obj=None, **kwargs):
form = super(self.__class__, self).get_form(request, obj, **kwargs)
form.current_user = request.user
return form
Код не тестил, могут быть ляпы :)
не работало.
сделал почти все так:
убрал метод save() и вместо него добавил конструктор:
    def __init__(self, *args, **kwargs):
super(TestAdminForm, self).__init__(*args, **kwargs)
self.fields['user'].initial = self.current_user
self.fields['user'].widget = self.fields['user'].hidden_widget()
теперь работает. хотя может это как то не есть хорошо.
я не понял зачем метод save() что он делает? Поясните пожалуйста.



Офлайн

#4 Окт. 17, 2011 22:34:05

pill
От:
Зарегистрирован: 2010-08-27
Сообщения: 223
Репутация: +  0  -
Профиль   Отправить e-mail  

ForeignKey в админке выбрать автоматически

apologize828
теперь работает. хотя может это как то не есть хорошо.
я не понял зачем метод save() что он делает? Поясните пожалуйста.
Сколько людей столько и решений, как по мне через инит тоже вполне нормально
save(), метод ModelForm отвечает за создание объекта, возвращает новосозданный объект.
В данном случае мы создаем объект Тест но не сохраняем его в БД (commit=False).
inst = super(self.__class__, self).save(commit=False)
Ручками добавляем юзера
inst.user = self.current_user
и сохраняем в БД
if commit:
inst.save()

Доки по save(): https://docs.djangoproject.com/en/dev/topics/forms/modelforms/#the-save-method

Чего он конкретно не сработал, не скажу… мож я где т протупил. В теории должно работать :)



Отредактировано (Окт. 17, 2011 23:12:07)

Офлайн

  • Начало
  • » Django
  • » ForeignKey в админке выбрать автоматически[RSS Feed]

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version