Как отобразить данные в наборе форм модели для внешнего ключа к полю manytomanyfield как текст только для чтения с предварительно заполненными данными, которые проходят валидацию?

У меня проблема с отображением данных в форме в виде текста, доступного для чтения. Моя модель:

class SalesPlan(models.Model):
    customer = models.ForeignKey(Customer, on_delete=models.RESTRICT)
    date = models.DateField(null=True, blank=True)
    product = models.ForeignKey(Product, on_delete=models.RESTRICT)
    quantity = models.FloatField(default=0)

Моя форма:

class SalesPlanForm(forms.ModelForm):
    # product = forms.CharField(widget=forms.TextInput(attrs={'readonly':'readonly'}))
    
    class Meta:
        model = SalesPlan
        fields = '__all__'
        widgets = {
            'customer': forms.HiddenInput(),
            'date': forms.HiddenInput(),
            
        }
      

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

Класс клиента:

class Customer(models.Model):
    code = models.CharField(max_length=6, primary_key=True, unique=True)
    name = models.CharField(max_length=100)
    belongs_to_sales_channel = models.ForeignKey(SalesChannel, on_delete=models.RESTRICT)
    portfolio = models.ManyToManyField(Product)
    date_created = models.DateTimeField(auto_now_add=True, null=True)

Если я не комментирую продукт в SalesPlanForm, я отображаю правильные данные, но форма не сохраняется с ошибкой:

ValueError at /sales/create/100022/2028/1/1/
Cannot assign "'product_1'": "SalesPlan.product" must be a "Product" instance.

Обратите внимание на двойные кавычки и одинарные кавычки для переменной. Если я назначу виджет для 'product' в dict в Meta, я могу сохранить форму, но данные, отображаемые в форме, будут просто 1, 2, 3, 4 для каждой формы в наборе форм вместо имени объекта product.

Есть ли способ заставить его отображать правильное название продукта (имя объекта, определяемое str в классе Product) вместо 1, 2 и так далее? Я не смог найти эквивалентную проблему здесь, хотя я прочитал много похожих проблем, одна из которых дала мне закомментированную строку в SalesPlanForm heh.

Спасибо.

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