Как обновить поле в модели, подключенной через внешний ключ

Я работаю над представлением обновления, где я хочу обновить размер футболки, щелкнув элемент в списке просмотра заказов. Я поставил точку, где я могу отображать только название предмета, но не обновлять размер футболки. Это Джанго 3.

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

модели.py

class Size(models.TextChoices):
    SMALL = 'S', 'Small'
    MEDIUM = 'M', 'Medium'
    LARGE = 'L', 'Large'


class Tshirt(models.Model):
    name = models.CharField(max_length=255)
    size = models.CharField(max_length=2, choices=Size.choices, default=Size.MEDIUM)

    def __str__(self):
        return self.name

class Order(models.Model):
    nr = models.PositiveIntegerField(unique=True)
    item = models.ForeignKey(Tshirt, related_name='order_tshirts', on_delete=models.CASCADE)
    send_date = models.DateTimeField(null=True, blank=True)
    
    def get_update_size_url(self):
        return reverse('size_update', kwargs = {'pk': self.pk})

urls.py

path('update/<int:pk>/', TshirtSizeUpdateView.as_view(), name='size_update'),

просмотры.py

class TshirtSizeUpdateView(UpdateView):
    model = Order
    template_name = 'size_update.html'
    fields = ['item']
    success_url = '/'

формы.py

class OrderForm(forms.ModelForm):
    class Meta:
        model = Order
        fields = '__all__'
```


update template
```
    <form method = "post">
        {% csrf_token %}
        {% include 'includes/bs4_form.html' with form=form %}
        <input type = "submit" class = "btn btn-primary mb-2" value = "Update">
    </form>
```

пожалуйста, покажи свой шаблон

ha-neul 10.12.2020 14:26

@ha-neul, пожалуйста, проверьте мою правку

Webdev 10.12.2020 14:35

Ваш шаблон не для обновления. Вы вставили неправильный?

ha-neul 10.12.2020 14:49

Кроме того, пожалуйста, покажите свой режим создания и создайте шаблон.

ha-neul 10.12.2020 14:58

@ha-neul исправлено, да, это был шаблон списка. CreateView нет, я управлял этим через админ-панель.

Webdev 10.12.2020 15:15
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
5
91
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вы можете использовать formset для этого случая.

в формах.py

from django.forms.models import inlineformset_factory

TshirtFormset = inlineformset_factory(
    Order, Tshirt, fields=('name', 'size')
)

в представлениях.py

class OrderUpdateView(UpdateView):
    model = Order
    fields = ["nr", "item", "send_date"]

    template_name = 'size_update.html'
    success_url = '/'

    def get_context_data(self, **kwargs):
        
        context = super(OrderUpdateView, self).get_context_data(**kwargs)
        if self.request.POST:
            context["tshirt_form"] = TshirtFormset(self.request.POST, instance=self.object)
        else:
            context["tshirt_form"] = TshirtFormset(instance=self.object)

        return context

    def form_valid(self, form):
        context = self.get_context_data()
        tshirt_form = context["tshirt_form"]
        self.object = form.save()
        if tshirt_form.is_valid():
            tshirt_form.instance = self.object
            tshirt_form.save()
        return super(OrderUpdateView, self).form_valid(form)

в своем шаблоне поместите форму заказа и набор форм для футболки.

<form method = "post">{% csrf_token %}
    {{ form.as_p }}
    <h2>T-shirt detail</h2>
    {{ tshirt_form.as_p }}
    <input type = "submit" value = "Save">
</form>

Другие вопросы по теме