【问题标题】:How to update field in model connected via foreign key如何更新通过外键连接的模型中的字段
【发布时间】:2021-03-21 21:55:09
【问题描述】:

我正在更新视图,我想通过单击订单视图列表中的项目来更新 T 恤的尺寸。我堆叠在只能显示项目名称但不能更新 T 恤尺寸的位置。这是 django 3。

请一些提示,我如何更新通过外键与 Order 模型连接的 tshirt 的大小。

models.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'),

views.py

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

forms.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 请检查我的编辑
  • 您的模板不用于更新。你是不是贴错了?
  • 另外请展示您的创建视图和创建模板
  • @ha-neul 已修复,是的,那是一个列表模板。没有 CreateView,我是通过管理面板管理的。

标签: python django forms view django-class-based-views


【解决方案1】:

您可以在这种情况下使用 formset。

在forms.py中

from django.forms.models import inlineformset_factory

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

在views.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)

在您的模板中,同时输入您的订单和 T 恤表单集。

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

【讨论】:

    猜你喜欢
    • 2012-05-16
    • 2015-01-29
    • 2021-04-02
    • 2018-09-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-29
    相关资源
    最近更新 更多