Получение данных внешнего ключа в форме Добавления/изменения администратора Django

#python #django #django-admin #admin

Вопрос:

Я пытаюсь настроить добавление/изменение администратора Django для проекта. Я создал модель под названием «Визит», которая содержит 3 поля внешнего ключа: «Клиент», «Домашнее животное» и «Врач». Рабочий процесс выглядит следующим образом:

  • Пользователь создает клиента.
  • Пользователь создает домашнее животное и связывает его с клиентом.
  • Пользователь создает визит и связывает его с домашним животным и врачом.

Ниже приведен код для моего models.py

 class Visit(models.Model):
    customer = models.ForeignKey('customer.Customer', on_delete=models.CASCADE)
    pet = models.ForeignKey('pet.Pet', on_delete=models.CASCADE)
    date = models.DateTimeField()
    doctor = models.ForeignKey(
        'configuration.Doctor', on_delete=models.DO_NOTHING, null=True, blank=True)
    status = models.CharField(
        choices=PET_STATUS, max_length=3, null=True, blank=True)
    reason = models.CharField(max_length=255)
    diagnosis = models.TextField(null=True, blank=True)
    treatment = models.TextField(null=True, blank=True)
    comment = models.TextField(null=True, blank=True)
    prescription = models.TextField(null=True, blank=True)
    weight = models.DecimalField(
        max_digits=6, decimal_places=2, null=True, blank=True)

    class Meta:
        ordering = ('-date',)
 

Моя проблема в том, что кто-то, использующий администратора Django для создания Визита, может неправильно выбрать Клиента и домашнее животное. Следовательно, Клиент не владеет этим Домашним животным. Я хотел бы знать, как я могу настроить администратора Django, чтобы, когда пользователь выбирает Клиента, в поле выбора отображались только Домашние животные под этим конкретным Клиентом.

Ниже приведен мой admin.py

 class VisitAdmin(admin.ModelAdmin):
    change_form_template = 'visit/invoice_button.html'
    add_form_template = 'visit/add_visit.html'

    list_display = ('customer', 'pet', 'date', 'status')
    list_filter = ('date', 'customer', 'pet', 'status')
    search_fields = ('customer__first_name',
                     'customer__last_name', 'pet__pet_name')
    autocomplete_fields = ['customer', 'pet', 'doctor']
    radio_fields = {'status': admin.HORIZONTAL}
    fieldsets = (
        (None, {
            "fields": ('customer', 'pet', 'doctor'),
        }),
        ("Visit Details", {
            "fields": ('date', 'reason', 'weight', 'status'),
        }),
        ("Visit Outcome", {
            "fields": ('diagnosis', 'treatment', 'comment')
        })
    )
    inlines = [FeeInLine, AttachmentInLine]

    actions = ['export_as_csv']

    def export_as_csv(self, request, queryset):

        meta = self.model._meta
        field_names = [field.name for field in meta.fields]

        response = HttpResponse(content_type='text/csv')
        response['Content-Disposition'] = 'attachment; filename={}.csv'.format(
            meta)
        writer = csv.writer(response)

        writer.writerow(field_names)
        for obj in queryset:
            row = writer.writerow([getattr(obj, field)
                                   for field in field_names])

        return response

    export_as_csv.short_description = "Export Selected"

    def response_change(self, request, obj):
        if "invoice" in request.POST:
            return render_pdf(request, obj.pk)
        return super().response_change(request, obj)


admin.site.register(Visit, VisitAdmin)