【问题标题】:Django: Slugify Post DataDjango:Slugify 发布数据
【发布时间】:2012-08-05 03:53:20
【问题描述】:

我正在尝试保存用户输入的一些表单数据。我想对用户输入的“名称”进行 slugify,但不希望 slug 字段显示在用户看到的模板上。我尝试使用您在下面看到的销售功能手动执行此操作,但无法使其正常工作。我想最终将 slugified 名称保存到下面列出的 Item 模型中。我确信有一种比我目前使用的销售功能更智能/更简单的方法:P。提前致谢!

class Item(models.Model):
    user = models.ForeignKey(User)
    name = models.CharField(max_length=75)
    slug = models.SlugField(max_length=50, unique=True)
    is_active = models.BooleanField(default=True)
    image =  models.CharField(max_length=50)
    price = models.DecimalField(max_digits=9, decimal_places=2)
    quantity = models.IntegerField(default=1)
    description = models.TextField()
    created = models.DateTimeField(auto_now_add=True)
    shipping_price = models.DecimalField(decimal_places=2, max_digits=6)
    categories = models.ManyToManyField(Category)


class AddItem(forms.ModelForm):
    class Meta:
        model = Item
        exclude = ('user','slug','is_active',)

def sell(request):
        if request.method == "POST":
            form = AddItem(request.POST)
            item = form.save(commit=False)
            item.user = request.user
            item.is_active = True
            item.slug = slugify(form.name) **#not sure what this line should be?** 
            item.save()
            if form.is_valid():
                form.save()
                return HttpResponseRedirect('thanks.html')
            else:
                url = urlresolvers.reverse('register')
                return HttpResponseRedirect(url)

【问题讨论】:

标签: python django


【解决方案1】:

您可以从用户表单中排除 slug。 并在 pre_save 信号中进行 slugify。

from django.dispatch import receiver
from django.db.models.signals import pre_save

@receiver(pre_save, sender=Item)
def iter_pre_save_handler(sender, instance, **kwargs):
    if not instance.pk:
        instance.slug = slugify(instance.name)

【讨论】:

    【解决方案2】:

    根据docs,您可以将字段排除在模型表单中,如下所示:

    class PartialAuthorForm(ModelForm):
        class Meta:
            model = Author
            fields = ('name', 'title')
    

    class PartialAuthorForm(ModelForm):
        class Meta:
            model = Author
            exclude = ('birth_date',)
    

    或通过在模型中的 Field 实例上设置 editable=False。

    完成此操作后,您可以覆盖模型的保存方法,正如 OP 中的 cmets 所建议的那样:

    #  shamelessly copied from http://stackoverflow.com/questions/837828/how-do-i-create-a-slug-in-django/837835#837835
    from django.template.defaultfilters import slugify
    
    class test(models.Model):
        q = models.CharField(max_length=30)
        s = models.SlugField()
    
        def save(self, *args, **kwargs):
            self.s = slugify(self.q)
            super(test, self).save(*args, **kwargs)
    

    【讨论】:

      猜你喜欢
      • 2013-12-03
      • 2017-02-04
      • 2016-09-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-09-07
      • 2016-07-23
      • 1970-01-01
      相关资源
      最近更新 更多