如何更新通过外键连接的模型中的字段
How to update field in model connected via foreign key
我正在处理更新视图,我想通过单击订单视图列表上的项目来更新 T 恤的尺寸。我堆叠在只能显示项目名称但不能更新 T 恤尺寸的位置。这是 Django 3.
请提示,我如何更新通过外键与 Order 模型连接的 T 恤的尺寸。
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>
```
在这种情况下,您可以使用 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>
我正在处理更新视图,我想通过单击订单视图列表上的项目来更新 T 恤的尺寸。我堆叠在只能显示项目名称但不能更新 T 恤尺寸的位置。这是 Django 3.
请提示,我如何更新通过外键与 Order 模型连接的 T 恤的尺寸。
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>
```
在这种情况下,您可以使用 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>