Django ForeignKey со сквозным параметром - PullRequest
0 голосов
/ 29 февраля 2020

Первоначально моя проблема заключалась в том, как заставить поля отображать Foreignkey, который находится в ModelForm. Я решил эту проблему с этим кодом, но я не могу заставить его работать.

Следующие модели делают мой код

class DocAide(models.Model):
    id = models.AutoField(primary_key=True)
    pulse = models.DecimalField('Pulse', max_digits=3, decimal_places=0, blank=True, null=True)
    weight = models.DecimalField('Weight (kg)', max_digits=3, decimal_places=0, blank=True, null=True)
    bp_sys = models.DecimalField('BP Sys', max_digits=3, decimal_places=0, blank=True, null=True)
    bp_dia = models.DecimalField('BP Dia', max_digits=3, decimal_places=0, blank=True, null=True)
    temperature = models.DecimalField('Temp. deg C', max_digits=2, decimal_places=1, blank=True, null=True)
    scans = models.ManyToManyField(Scan, blank=True)
    tests = models.ManyToManyField(LabTest,  blank=True)
    date = models.DateField(editable=False, default=timezone.now)
    patient = models.ForeignKey(Patient, on_delete=models.CASCADE)
    created_by = models.ForeignKey(Doctor, on_delete=models.CASCADE, blank=True, null=True)
    no_charge = models.BooleanField('No Charge from Patient', default=False)
    doctors_notes = models.TextField('Patient is complaining about:', default='')
    part_to_scan = models.CharField(max_length=100, default='N/A', blank=True, null=True)
    part_to_xray = models.CharField(max_length=100, default='N/A', blank=True, null=True)
    note = models.TextField(max_length=100, default='')

и

class PrescriptionLine(models.Model):
    drug = models.ForeignKey(to=Drug, related_name='prescriptionlines', on_delete=models.CASCADE)
    doc_aide = models.ForeignKey(to=DocAide, related_name='prescriptionlines', on_delete=models.CASCADE)
    morning = models.CharField(validators=[int_list_validator], max_length=3, default=0)
    midday = models.CharField(validators=[int_list_validator], max_length=3, default=0)
    evening = models.CharField(validators=[int_list_validator], max_length=3, default=0)
    night = models.CharField(validators=[int_list_validator], max_length=3, default=0)
    days = models.CharField(validators=[int_list_validator], max_length=3, default=0)
    tablets = models.CharField(validators=[int_list_validator], max_length=3, default=0)

Мои формы выглядят так:

class DocAideForm(forms.ModelForm):

    class Media:
        css = {'all': ('/static/admin/css/widgets.css',), }
        js = ('/admin/jsi18n/',)

    class Meta:
        model = DocAide
        fields = [  # 'no_charge',
                  'doctors_notes', 'scans', 'part_to_xray', 'part_to_scan', 'tests', 'prescriptions']

Без рецептов это работает, но я не могу получить доступ к данным из рецепта.

Итак, как мне создать форму так, как я хочу, из поля рецептов? Я думал через "до" это связано с doc_aide_form. Пока я пишу это, у меня просто была другая идея. Я мог бы создать кнопку в шаблоне doc_aide_form для рецепта и сделать там целую форму. Но все же, как мне использовать эту структуру более эффективно.

Спасибо

Ответы [ 2 ]

1 голос
/ 29 февраля 2020

Чтобы создать форму со строками, вы должны использовать inlineformset_factory . Вы можете проверить пример его использования в официальной django документации .

models.py:

from django.db import models

class Author(models.Model):
    name = models.CharField(max_length=100)

class Book(models.Model):
    author = models.ForeignKey(Author, on_delete=models.CASCADE)
    title = models.CharField(max_length=100)

views.py

from django.forms import inlineformset_factory
BookFormSet = inlineformset_factory(Author, Book, fields=('title',))
author = Author.objects.get(name='Mike Royko')
formset = BookFormSet(instance=author)
0 голосов
/ 01 марта 2020

Таким образом, чтобы получить доступ к PrescriptionLine объектам, подключенным к объекту DocAide, у вас должно быть что-то вроде этого

docaide = DocAide.objects.get(id=5)
for line in docaide.prescriptionlines:
    line.drug = Drug.objects.get(id=6)

Я хочу указать, что объект DocAide подключен к списку PrescriptionLine объектов. Даже если с конкретным DocAide объектом связан только один PrescriptionLine, атрибут prescriptionlines вернёт список или точный набор запросов.

И я хочу обратить ваше внимание на InlineFormsets. Я не уверен, что это то, о чем вы спрашиваете, но в любом случае полезно знать о них. InlineFormsets позволяет добавлять / редактировать PrescriptionLines для объекта DocAide на той же странице. Пример кода, который я приведу ниже, будет применяться только к сайту администратора.

class PrescriptionLineInline(admin.TabularInline):
    model = PrescriptionLine
    extra = 1

class DocAideAdmin(admin.ModelAdmin):
    inlines = [PrescriptionLineInline, ]

site.admin.register(DocAideAdmin)

Это относится к файлу admin.py и, как я уже сказал, это повлияет только на сайт администратора. Это создаст раздел на страницах DocAide для непосредственного добавления, редактирования и удаления PrescriptionLines.

Чтобы реализовать то же поведение во внешнем интерфейсе (за пределами сайта администратора), вам придется отредактировать форму класс и использовать formset_factory, или если вы работаете с ModelForm (кажется, что вы), вы бы go с более простым inlineformset_factory.

Если вы хотите реализовать форму во фронтэнде я бы предложил сначала внедрить его на сайте администратора, так как это проще, и вы получите представление о том, как все сочетается. docs страница о встроенных формах.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...