首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Django,手动设置formset/object日期

Django,手动设置formset/object日期
EN

Stack Overflow用户
提问于 2022-02-25 18:06:16
回答 1查看 35关注 0票数 0

我想做一个简单的应用程序汽车机械,但我有一个问题,我无法解决我自己,因为我是一个新手。从一开始,我就列出了一辆汽车的服务清单,以及使用的部件,按日分组在引导手风琴(如这个https://ibb.co/8XWJx1S)中。在我的编辑视图中,我从某一天抓取所有服务和部件。在编辑模板中,我可以动态添加表单集(https://ibb.co/qBKL4Tk)。问题是,当我在编辑时添加新服务或部件时,它会使用不同的日期保存,然后在列表视图中它不会与我想要的服务分组,因为它的日期是不同的。是否有方法手动将此日期设置为与其他对象相同?第二个选项,不是想要的,而是可以接受的,就是基于新对象更新其他对象的DATE.FIELD,我尝试了,但失败了。

models.py

代码语言:javascript
复制
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

代码语言:javascript
复制
@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})
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 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)

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71270015

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档