【问题标题】:Pass multiple parameters in Django在 Django 中传递多个参数
【发布时间】:2020-05-10 17:18:31
【问题描述】:
class Article(models.Model):
      Title     = models.CharField(max_length = 255)
      writing       = models.TextField()
      category  = models.CharField(max_length = 225)
      published = models.DateTimeField(auto_now_add=True)
      updated       = models.DateTimeField(auto_now=True)
      slug      = models.SlugField(blank=True, editable=False)

      def save(self):
         self.slug = slugify(self.Title)
         super().save()

      def get_absolute_url(self):
         url_slug = {'slug':self.slug}
         return reverse('artikel:ArticleDetail', kwargs = url_slug)

      def __str__(self):
         return "{}.{}".format(self.id, self.Title)

我想用 django 建立一个简单的网站,它可以通过表单发布一些文章。问题是我如何在一篇文章中发布多个类别?这是下面的form.py。

from .models import Article
from django.forms import ModelForm 

class ArticleForm(ModelForm):
   class Meta:
      model = Article
      fields = [
        'title',
        'writing',
        'category',
       ]

【问题讨论】:

  • 您应该考虑在类别字段中使用ManyToManyField 而不是CharField

标签: python django django-models django-views web-site-project


【解决方案1】:

您可以ManyToManyField 将您的帖子链接到多个类别,例如:

class Category(models.Model):
    name = models.CharField(max_length=128, unique=True)

    def __str__(self):
        return self.name

class Article(models.Model):
    title = models.CharField(max_length=255)
    writing = models.TextField()
    category = models.ManyToManyField(Category)
    published = models.DateTimeField(auto_now_add=True)
    updated = models.DateTimeField(auto_now=True)
    slug = models.SlugField(blank=True, editable=False)

    def save(self, *args, **kwargs):
        self.slug = slugify(self.title)
        super().save()

    def get_absolute_url(self):
        return reverse('artikel:ArticleDetail', kwargs={'slug': self.slug})

      def __str__(self):
         return '{}.{}'.format(self.id, self.title)

话虽如此,已经有一些用于此的软件包。 django-taggit [GitHub] 例如,您可以通过以下方式安装它:

pip3 install <b>django-taggit</b>

并将'taggit' 包含在INSTALLED_APPS list [Django-doc] 中:

# settings.py

INSTALLED_APPS = [
    # …,
    'taggit',
    # …
]

然后在您的模型中,您可以将TaggableManager 添加到模型中:

from django.db import models
from taggit.managers import TaggableManager


class Article(models.Model):
    title = models.CharField(max_length=255)
    writing = models.TextField()
    categories = TaggableManager()
    published = models.DateTimeField(auto_now_add=True)
    updated = models.DateTimeField(auto_now=True)
    slug = models.SlugField(blank=True, editable=False)

    def save(self, *args, **kwargs):
        self.slug = slugify(self.title)
        super().save()

    def get_absolute_url(self):
        return reverse('artikel:ArticleDetail', kwargs={'slug': self.slug})

      def __str__(self):
         return '{}.{}'.format(self.id, self.title)

正如文档所指定的,它带有一个form field,允许人们编写空格分隔和逗号分隔的标签。

【讨论】:

  • 如何在 template.html 和 views.py 中应用它?
  • 如果您在视图中使用ModelForm,那么它将使用模板中的特定表单字段来呈现它。
  • 不,我的意思是我们如何创建相关的类别并将其显示在网站上,我已经完成了 ModelForm
  • @IchwanulMukminAbbas:通常TaggableManager 根据输入的名称创建Tag 对象。
猜你喜欢
  • 1970-01-01
  • 2021-09-12
  • 2016-02-20
  • 2018-03-21
  • 2020-09-06
  • 1970-01-01
  • 2021-09-14
  • 1970-01-01
  • 2022-01-09
相关资源
最近更新 更多