【问题标题】:Modify models field via view doesn't work通过视图修改模型字段不起作用
【发布时间】:2018-06-24 06:40:00
【问题描述】:

在我的 Django 应用程序中,我想使用表单所在的“EventDetailView”视图在“事件”模型中减去 1 个“free_places”字段。每次表单OK(当用户订阅事件时),“free_places”字段应该减少1。

我不知道为什么我的代码不起作用。

我的看法:

class EventDetailView(DetailView, ModelFormMixin):
    model = models.Event
    form_class = forms.RegisterForm
    context_object_name = 'event'

    def get_success_url(self):
        return reverse('events:list')

    def get_initial(self):
        return {'event': self.kwargs['pk']}

    def post(self, request, *args, **kwargs):
        form = self.get_form()
        if form.is_valid():
            self.object = self.get_object()
            self.object.free_places - 1
            self.object.save()
            return self.form_valid(form)
        else:
            return self.form_invalid(form)

型号:

class Event(models.Model):
    title = models.CharField(max_length=500)
    date = models.DateField()
    text = models.TextField()
    image = FilerImageField(null=True, blank=True)
    flag = models.ForeignKey(Flag)
    free_places = models.IntegerField()

    class Meta:
        ordering = ['-date']

    def __str__(self):
        return self.title

    @property
    def slug(self):
        return slugify(self.title)

    def get_absolute_url(self):
        return reverse('events:detail', args=[self.slug, self.id])

    def get_model_id(self):
        return self.id


class Register(models.Model):
    event = models.ForeignKey(Event)
    first_name = models.CharField(max_length=30)
    last_name = models.CharField(max_length=30)
    company = models.CharField(max_length=30, blank=True)
    street = models.CharField(max_length=50, blank=True)
    post_code = models.CharField(max_length=30, blank=True)
    city = models.CharField(max_length=30, blank=True)
    email = models.EmailField()
    phone_number = models.IntegerField()

    def __str__(self):
        return self.first_name

    def get_event_name(self):
        return self.event

【问题讨论】:

  • 什么不起作用?实际发生了什么?你预计会发生什么?
  • 我希望在“事件”模型@Alasdair 中的“free_places”字段上的“RegisterForm”表单上按保存后减少 1
  • 好的,那么当你按下保存时实际发生了什么? EventDetailView 是否运行?如果是这样,post 方法是否运行?如果是,表格是否有效?尝试找出代码中的问题所在。
  • free_places 的值与在表单上按保存之前相同。符合self.object.free_places - 1我有提示**声明似乎没有效果** @Alasdair
  • 您找到了问题所在。你没有对self.object.free_places - 1 的结果做任何事情,所以self.object.free_places 的值保持不变。

标签: python django forms models


【解决方案1】:

您需要分配self.object.free_places - 1 的结果。目前你没有用它做任何事情。

将行更改为:

self.object.free_places -= 1

self.object.free_places = self.object.free_places - 1

如果多个用户同时提交表单,代码很容易受到竞争条件的影响。您可以使用F() objects 解决此问题。

from django.db.models import F
self.object.free_places = F('free_places') - 1
self.object.save()

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-09-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多