Django:Slugify 发布数据
Posted
技术标签:
【中文标题】Django:Slugify 发布数据【英文标题】:Django: Slugify Post Data 【发布时间】: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)
【问题讨论】:
您可以在模型的保存方法中执行此操作。 嘿 ahsan 感谢您的回复,我不太熟悉它是如何工作的,我可以在项目类中添加一个保存方法吗?并在视图中调用该方法? ***.com/a/837835/684890 ? 也可以在保存签出时执行此操作:***.com/a/817364/684890 【参考方案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://***.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)
【讨论】:
以上是关于Django:Slugify 发布数据的主要内容,如果未能解决你的问题,请参考以下文章