Найти - Пользователи
Полная версия: Доступ из дочерней модели к родительской по pk родительской
Начало » Базы данных » Доступ из дочерней модели к родительской по pk родительской
1
easthy
Подскажите

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

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
Может стоить попробовать

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
Сделал по второму варианту, теперь другая проблема - в валидации формы.
Если вывожу всю форму на страницу (при этом заполняю форму из базы
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)
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