Уведомления

Группа в Telegram: @pythonsu

#1 Май 27, 2013 21:43:06

easthy
Зарегистрирован: 2013-05-24
Сообщения: 34
Репутация: +  0  -
Профиль   Отправить e-mail  

Доступ из дочерней модели к родительской по pk родительской

Подскажите

Допустим есть модели

class SocWorker(models.Modelr):
    data = models.CharField('данные', max_length=10, blank=True)
    data2 = models.CharField('данные2', max_length=11, blank=True)

class SocWorker_detailed_inf(SocWorker):
    data3 = models.CharField('данные3', max_length=10, blank=True)
    data4 = models.CharField('данные4', max_length=11, blank=True)

Здесь все поля SocWorker доступны из SocWorker_detailed_inf, верно?
Как получить данные из первой модели по pk первой модели?

socworker = get_object_or_404(SocWorker_detailed_inf, pk=soc_id)
В этом случае получаю 404 ошибку:
No SocWorker_detailed_inf matches the given query.
Видимо в запросе идёт обращение к pk SocWorker_detailed_inf, а не к pk SocWorker

Отредактировано easthy (Май 27, 2013 21:43:34)

Офлайн

#2 Май 27, 2013 21:52:18

easthy
Зарегистрирован: 2013-05-24
Сообщения: 34
Репутация: +  0  -
Профиль   Отправить e-mail  

Доступ из дочерней модели к родительской по pk родительской

Может стоить попробовать

class SocWorker(models.Modelr):
    data = models.CharField('данные', max_length=10, blank=True)
    data2 = models.CharField('данные2', max_length=11, blank=True)
class SocWorker_detailed_inf(SocWorker):
    data3 = models.CharField('данные3', max_length=10, blank=True)
    data4 = models.CharField('данные4', max_length=11, blank=True)
    class Meta:
            abstract = True

Тогда поля SocWorker_detailed_inf будут добавлены к полям SocWorker и обращение по pk будет идти уже к SocWorker
Но:
1) Как тогда быть с формой для SocWorker_detailed_inf, она будет содержать поля и для модели SocWorker? Тогда не получив нужные POST данные будет всё время показываться ошибка…

class SocWorkerDetailedForm(ModelForm):
    class Meta:
        model = SocWorker_detailed_inf

2) Таблица для SocWorker уже существует и наполнена данными, syncdb ведь не выполнит alter table add column

Отредактировано easthy (Май 27, 2013 21:54:27)

Офлайн

#3 Май 28, 2013 11:09:19

easthy
Зарегистрирован: 2013-05-24
Сообщения: 34
Репутация: +  0  -
Профиль   Отправить e-mail  

Доступ из дочерней модели к родительской по pk родительской

Сделал по второму варианту, теперь другая проблема - в валидации формы.
Если вывожу всю форму на страницу (при этом заполняю форму из базы

form = SocWorkerForm(agency=agency, instance=socworker)
- данные сохраняются в базу, а если вывожу лишь одно требуемое поле и пытаюсь заполнить форму из базы - Ошибка валидации
form = SocWorkerForm(request.POST, agency=agency, instance=socworker)

Как быть?

Модели:
class SocWorker(SocWorker_detailed_inf):
    data = models.CharField('данные', max_length=10, blank=True)
    data2 = models.CharField('данные2', max_length=11, blank=True)
class SocWorker_detailed_inf(models.Model):
    data3 = models.CharField('данные3', max_length=10, blank=True)
    data4 = models.CharField('данные4', max_length=11, blank=True)
    class Meta:
            abstract = True

Использую одну форму:
class SocWorkerForm(ModelForm):
    class Meta:
        model = SocWorker
        exclude = ('agency', 'atime', 'details_id', 'socworker_id')
    def __init__(self, *args, **kwargs):
        self.agency = kwargs.pop('agency')
        super(SocWorkerForm, self).__init__(*args, **kwargs)
        self.fields['department'].queryset = Department.objects.filter(agency=self.agency)

view файл

    socworker = get_object_or_404(SocWorker, pk=soc_id)
    alphabet = socworker.surname[:1]  # первая буква фамилии 
    if request.method == 'POST':
        #request.POST.__setitem__('alphabet', alphabet)
        form = SocWorkerForm(request.POST, agency=agency, instance=socworker)
        if form.is_valid():
            socworker = form.save()
            action = 'success'
            return HttpResponseRedirect('/agency/socworker/%d_detailed/' % socworker.id)
        else:
            action = 'errors' 
    else:
        action = 'new'
        form = SocWorkerForm(agency=agency, instance=socworker)

Отредактировано easthy (Май 28, 2013 11:11:52)

Офлайн

Board footer

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

Powered by DjangoBB

Lo-Fi Version