Найти - Пользователи
Полная версия: ForeignKey в админке выбрать автоматически
Начало » Django » ForeignKey в админке выбрать автоматически
1
apologize828
Допустим есть любая модель, ну например такая:
# 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 автоматом выбирался пользователь под которым я зашел в админку и самому не выбирать это?
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
Код не тестил, могут быть ляпы :)
apologize828
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() что он делает? Поясните пожалуйста.
pill
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

Чего он конкретно не сработал, не скажу… мож я где т протупил. В теории должно работать :)
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB