我想做一个简单的应用程序汽车机械,但我有一个问题,我无法解决我自己,因为我是一个新手。从一开始,我就列出了一辆汽车的服务清单,以及使用的部件,按日分组在引导手风琴(如这个https://ibb.co/8XWJx1S)中。在我的编辑视图中,我从某一天抓取所有服务和部件。在编辑模板中,我可以动态添加表单集(https://ibb.co/qBKL4Tk)。问题是,当我在编辑时添加新服务或部件时,它会使用不同的日期保存,然后在列表视图中它不会与我想要的服务分组,因为它的日期是不同的。是否有方法手动将此日期设置为与其他对象相同?第二个选项,不是想要的,而是可以接受的,就是基于新对象更新其他对象的DATE.FIELD,我尝试了,但失败了。
models.py
class Service(models.Model):
user = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE, null=True)
car = models.ForeignKey(Car, on_delete=models.CASCADE)
service_name = models.CharField(max_length=150, verbose_name='Service', default=None)
service_price = models.DecimalField(max_digits=20, decimal_places=2, default=None)
date_added = models.DateField(auto_now_add=True)
def __str__(self):
return self.service_name
def save(self, *args, **kwargs):
"""Update parent model date_updated field whenever child object is added/edited"""
self.car.save(update_fields=['date_updated'])
super(Service, self).save(*args, **kwargs)
class CarPart(models.Model):
user = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE, null=True)
car = models.ForeignKey(Car, on_delete=models.CASCADE)
car_part = models.CharField(max_length=30, blank=True, null=True, verbose_name='Part')
part_price = models.DecimalField(max_digits=20, decimal_places=2, null=True, blank=True)
pdate_added = models.DateField(auto_now_add=True)
def __str__(self):
return f"Part: {self.car_part} Price: {self.part_price}"views.py
@method_decorator(login_required, name='dispatch')
class ServiceAddView(CreateView):
model = Service
template_name = 'san_diego/service_add.html'
def get(self, request, *args, **kwargs):
self.object = None
car = Car.objects.get(uuid=self.kwargs.get('uuid'))
service_formset = ServiceFormSet(queryset=Service.objects.none(), prefix='service_formset')
formset = CarPartFormSet(queryset=CarPart.objects.none(), prefix='carpart_formset')
return self.render_to_response(
self.get_context_data(form=service_formset, formset=formset, car=car))
def post(self, request, *args, **kwargs):
self.object = None
car = Car.objects.get(uuid=self.kwargs.get('uuid'))
service_formset = ServiceFormSet(self.request.POST, prefix='service_formset')
formset = CarPartFormSet(self.request.POST, prefix='carpart_formset')
if service_formset.is_valid() and formset.is_valid():
return self.form_valid(service_formset, formset)
else:
return self.form_invalid(service_formset, formset, car)
def form_valid(self, service_formset, formset):
form = service_formset.save(commit=False)
formset = formset.save(commit=False)
for f in form:
f.car = Car.objects.get(uuid=self.kwargs.get('uuid'))
f.user = self.request.user
f.save()
for f in formset:
f.car = Car.objects.get(uuid=self.kwargs.get('uuid'))
f.user = self.request.user
f.save()
return redirect(self.get_success_url())
def form_invalid(self, service_formset, formset, car):
return self.render_to_response(self.get_context_data(form=service_formset, formset=formset, car=car))
def get_success_url(self):
"""If statement is adding funcionality to SAVE AND ADD ANOTHER button."""
car = get_object_or_404(Car, uuid=self.kwargs.get('uuid'), user=self.request.user)
if "another" in self.request.POST:
return reverse_lazy('service_add', kwargs={'uuid': car.uuid})
return reverse_lazy('service_history', kwargs={'uuid': car.uuid})
import datetime
@method_decorator(login_required, name='dispatch')
class ServiceEditView(UpdateView):
model = Service
template_name = 'san_diego/service_add.html'
def get_object(self):
"""Pass UUID"""
return Car.objects.get(uuid=self.kwargs.get("uuid"))
def get(self, request, *args, **kwargs):
self.object =self.get_object()
service_formset = ServiceFormSet(queryset=Service.objects.filter(
car=self.get_object(), user=self.request.user, date_added=self.kwargs.get('date')), prefix='service_formset')
formset = CarPartFormSet(queryset=CarPart.objects.filter(
car=self.get_object(), user=self.request.user, pdate_added=self.kwargs.get('date')), prefix='carpart_formset')
return self.render_to_response(
self.get_context_data(form=service_formset, formset=formset))
def post(self, request, *args, **kwargs):
self.object = self.get_object()
service_formset = ServiceFormSet(self.request.POST, prefix='service_formset')
formset = CarPartFormSet(self.request.POST, prefix='carpart_formset')
if service_formset.is_valid() and formset.is_valid():
return self.form_valid(service_formset, formset)
else:
return self.form_invalid(service_formset, formset)
def form_valid(self, service_formset, formset):
form = service_formset.save(commit=False)
formset = formset.save(commit=False)
for f in form:
f.car = self.get_object()
f.user = self.request.user
f.save()
for f in formset:
f.car = self.get_object()
f.user = self.request.user
f.save()
return redirect(self.get_success_url())
def form_invalid(self, service_formset, formset):
return self.render_to_response(self.get_context_data(form=service_formset, formset=formset))
def get_success_url(self):
car = get_object_or_404(Car, uuid=self.kwargs.get('uuid'), user=self.request.user)
return reverse_lazy('service_history', kwargs={'uuid': car.uuid})发布于 2022-02-27 12:40:07
如果将来有人对此有意见的话。我的第一种方法是正确的,即在调用UpdateView之前将这些行添加到f.save()
f.date_added = self.kwargs.get('date')
因为这在date_added = models.DateField(auto_now_add=True)模型中是行不通的,我已经对它进行了研究,而且似乎auto_now_add是不可编辑的。所以我把它改成了date_added = models.DateField(default=datetime.date.today)
https://stackoverflow.com/questions/71270015
复制相似问题