Как вернуть отдельное, связанное значение из формы Django?

Я работаю над простой системой планирования встреч, в которой клиенты могут привозить свой автомобиль на обслуживание. Клиенты могут иметь несколько автомобилей и иметь логин с сохранением всей информации об автомобиле. Большинство клиентов отслеживают свой автомобиль по номеру "единицы".

При заполнении формы они выбирают филиал (сервисный центр), где они хотят выполнить работу, дату, временной интервал и выбирают свой автомобиль по номеру агрегата. На задней панели блок и VIN связаны вместе. Однако в настоящее время, когда они отправляют запрос на обслуживание, приходит только номер агрегата. Мне нужно, чтобы связанный с ним VIN указывался автоматически.

Я пытался вернуть отдельные значения из модели автомобиля (я не могу понять это), я пытался вернуть их с помощью f', но это возвращает их как одну строку с единицей и VIN вместе. Я потратил, наверное, 3-4 часа, пытаясь разобраться с этим. Любая помощь приветствуется!!!

Models.py

class Vehicle(models.Model):
    unit = models.CharField(max_length=10, help_text="Unit number for the vehicle")
    vin = models.CharField(max_length=17, unique=True, validators=[MinLengthValidator(17)],  help_text="VIN of the vehicle")
    engine = models.ForeignKey(Engine, on_delete=models.SET_NULL, null=True)
    engineMfg = models.ForeignKey(engineMfg, on_delete=models.SET_NULL, null=True)
    sold_to = models.ForeignKey(User, on_delete=models.SET_NULL, null=True, blank=True)
    mileage = models.IntegerField(default=0, help_text="Mileage of the vehicle")

    class Meta:
        ordering= ['unit', 'vin']
        permissions = (
            ('view_all_vehicles', "View All Vehicles"), # this is only a permission to do something, it does NOT change a book state
        )

    def __str__(self):
        #return f'{self.unit} - {self.vin}'
        #return self.vin
        return self.unit

class Appointment(models.Model):

    class Meta:
        unique_together = ('branch', 'date', 'timeslot')
    
    Timeslot_List = (
        (0, '07:00 - 09:00'),
        (1, '09:00 - 11:00'),
        (2, '13:00 - 15:00'),
        (3, '15:00 - 17:00'),
        (4, '17:00 - 19:00'),
    )

    Booking_Status = (
        ('a', "Available"),
        ('b', "Booked"),
        ('r', "Requested")
    )

    status = models.CharField(
        max_length=1,
        choices=Booking_Status,
        blank=True,
        default='a',
        help_text="Booking Availability",
    )

    branch = models.ForeignKey('Branch', on_delete=models.SET_NULL, null=True)
    unit = models.ForeignKey(Vehicle, related_name='UNIT', on_delete=models.SET_NULL, null=True)
    vin = models.ForeignKey(Vehicle, related_name='VIN', on_delete=models.SET_NULL, null=True)
    date = models.DateField(help_text="MM-DD-YY")
    timeslot = models.IntegerField(choices=Timeslot_List)
    sold_to = models.ForeignKey(User, on_delete=models.SET_NULL, null=True)
    

    def __str__(self):
        return str(self.sold_to)

    @property
    def time(self):
        return self.Timeslot_List[self.timeslot][1]

Views.py

def new_appointment(request):
    if request.method == 'POST':
        form = AppointmentForm(user=request.user, data=request.POST)
        if form.is_valid():
            appt = form.save(commit=False)
            appt.sold_to = request.user
            appt.status = 'r'
            appt.save()
            return redirect('/')
    else:
        form = AppointmentForm(user=request.user)
    return render(request, 'catalog/appointment_form.html', {'form':form})

Forms.py

class AppointmentForm(forms.ModelForm):

    class Meta:
        model = Appointment
        timeslot = Appointment.objects.filter(status__exact='b')
        #unit = Vehicle.unit
        exclude = ('status', 'sold_to', 'vin')
        widgets = {
            'date': DateTimeWidget(
                attrs={'id': 'date'}, usel10n=True, bootstrap_version=5,
                options={
                    'minView': 2, # month view
                    'maxView': 3, # year view
                    'weekStart': 1,
                    'todayHighlight': True,
                    'format': 'mm-dd-yy',
                    'daysOfWeekDisabled': [0,6],
                    'startDate': date.today().strftime('%Y-%m-%d'),
                }
            ),
        }
    
    def clean_date(self):
        day = self.cleaned_data['date']

        if day <= date.today():
            raise forms.ValidationError("Date should be in the future", code='invalid')
        if day.isoweekday() in (0,6):
            raise forms.ValidationError("Must be scheduled on a weekday", code='invalid')

        return day
    
    def __init__(self, **kwargs):
        sold_to = kwargs.pop('user')
        super(AppointmentForm, self).__init__(**kwargs)
        self.fields['unit'].queryset = Vehicle.objects.filter(sold_to=sold_to)

Edit: Я также пробовал ниже, но python кричит на меня, что это не разрешено, по какой-то причине...

unit = models.ForeignKey(Vehicle.unit, on_delete=models.SET_NULL, null=True)
vin = models.ForeignKey(Vehicle.vin, on_delete=models.SET_NULL, null=True)

ПОЛУЧИЛ ЕГО!!!!!

Мне нужно было установить общее поле CharField в классе Appointment:

class Appointment(models.Model):
    ...
    vin = models.CharField(max_length=17)
    ...

Это, в сочетании с изменением взглядов, как обсуждалось в edit2 выше:

def new_appointment(request):
            ...
            appt.vin = appt.unit.vin # <---- This line here
            ...

Сделал все так, как я хотел!

Сегодня ушло 8 часов...

Вернуться на верх