Восстановление пользовательского поля при редактировании формы администратора Django
С учетом текущих моделей в models.py:
from django import forms
from django.db import models
from decimal import Decimal
from datetime import datetime, date
class Order (models.Model):
assignment = models.ForeignKey("Assignment", on_delete=models.RESTRICT)
qty = models.PositiveIntegerField(default=1)
order_date = models.DateField()
price = models.DecimalField(max_digits=10, decimal_places=2)
class Assignment (models.Model):
assig_year = models.PositiveSmallIntegerField()
customer = models.ForeignKey("Customer", on_delete=models.CASCADE)
agent = models.ForeignKey("Agent", on_delete=models.CASCADE)
class Agent (models.Model):
name = models.CharField(max_length=32)
surname = models.CharField(max_length=32)
class Customer (models.Model):
name = models.CharField(max_length=64)
Мне нужно предоставить пользователям пользовательскую форму администратора, которая позволяет создавать и обновлять заказы более интуитивно понятным способом. Для этого я исключаю поле назначения (которое связывает клиента с торговым агентом на определенный год, но может быть не так очевидно для заполнения пользователем) и включаю пользовательское поле, чтобы пользователь мог выбрать только клиента. На основе этого ввода и даты заказа я внутренне ищу конкретное назначение, удовлетворяющее этим критериям, и назначаю его заказу для хранения в базе данных. Это выглядит следующим образом:
admin.py
from django.core.exceptions import ObjectDoesNotExist, ValidationError
from django.contrib import admin
from django.db.models import CharField
from django import forms
from django.db import models
from .models import Customer, Assignment, Order
class OrderForm(forms.ModelForm):
customers_list = forms.ModelChoiceField(queryset = Customer.objects.all())
class Meta:
model = Order
exclude = (
'assignment',
)
def save(self, commit=True):
# Create an Order instance but do not commit to the DB yet
obj: Order = super().save(commit=False)
# Look for the associated assignment. If it doesn't exist, an error is raised
try:
assignment = Assignment.objects.get(assig_year=obj.order_date.year, customer=self.cleaned_data['customers_list'])
except ObjectDoesNotExist:
raise ValidationError('No assignment found')
# Add the assignment reference to the order and save it
obj.assignment = assignment
obj.save()
return obj
def clean(self):
cleaned_data = self.cleaned_data
date_form = cleaned_data['order_date']
customer_form = cleaned_data['customers_list']
try:
cleaned_data['assignment'] = Assignment.objects.get(assig_year=date_form.year, customer=customer_form.id)
except ObjectDoesNotExist:
raise ValidationError('No assignment found')
# Then call the clean() method of the super class
super(OrderForm, self).clean()
# Finally, return the cleaned_data
return cleaned_data
class OrderAdmin(admin.ModelAdmin):
form = OrderForm
fieldsets = (
('Order Data:', {
'fields': ( 'customers_list', 'qty', 'order_date', 'price', )
}),
)
При создании нового заказа все работает нормально, однако, если я вхожу в ранее созданный регистр в режиме администратора, пользовательское поле Customer не заполняется автоматически, и я не знаю, как восстановить его первоначальное значение. Есть идеи?