使用 Materialise 的外键 Django 表单

Django Forms with Foreign Key using Materialize

我想要的

创建在模板上的 Django 管理中显示的相同表单。

问题

我无法将外键加载到表单中。我一直在寻找解决方案两天。我已经阅读了 Django documentationModelFormQuerySet 但我找不到解决方案。如果这里有人可以帮助我,那就太棒了。感谢您的宝贵时间!

我的代码

models.py:

from django.conf import settings
from django.db import models
from django.utils import timezone
from taggit.managers import TaggableManager
from ckeditor.fields import RichTextField

class Categoria(models.Model):
    categoria = models.CharField(
        max_length=200, verbose_name="Nome da categoria", 
        help_text="colocar aqui o texto de ajuda"
    )
    resumo = models.CharField(
        max_length=200, verbose_name="Resumo",
        help_text="colocar aqui o texto de ajuda"
    )
    slug = models.CharField(max_length=200, default=1)

    class Meta:
        # Gives the proper plural name for admin
        verbose_name_plural = "Categorias"
        verbose_name = "categoria"

    def __str__(self):
        return self.categoria

class Serie(models.Model):
    serie = models.CharField(
        max_length=200,
        verbose_name="Série",
        help_text="colocar aqui o texto de ajuda"
    )
    categoria = models.ForeignKey(
        Categoria,
        default=1,
        on_delete=models.SET_DEFAULT
    )
    resumo = models.CharField(max_length=200)

    class Meta:
        verbose_name_plural = "serie"

    def __str__(self):
        return self.serie

class Artigo(models.Model):
    title = models.CharField(
        max_length=200,
        verbose_name='Título do Post',
        help_text='Procure usar um texto que seja a pergunta de um usuário: Ex. Como escolher o revestimento '
    )
    heading = models.CharField(
        max_length=250,
        verbose_name='Chamada',
        help_text='Um texto pequeno para atrair o leitor'
    )
    serie = models.ForeignKey(
        Serie,
        default='1',
        on_delete=models.SET_DEFAULT
    )
    text = RichTextField(blank=True, null=True)
    created_date = models.DateTimeField(
        default=timezone.now,
        verbose_name='Data de criação:'
    )
    published_date = models.DateTimeField(
        blank=True,
        null=True,
        verbose_name='Data de postagem:'
    )
    slug = models.SlugField(
        unique=True,
        max_length=100,
        verbose_name='Url única:',
        help_text='A URL deve ser única, representar o conteúdo, e ser chamativa para SEO'
    )
    tags = TaggableManager(verbose_name='tags')

    def publish(self):
        self.published_date = timezone.now()
        self.save()

    def __str__(self):
        return self.title

forms.py:

from django import forms
from .models import Artigo, Serie

class PostForm(forms.ModelForm):
    class Meta:
        model = Artigo
        fields = '__all__'

        widgets = {
            'title': forms.TextInput(attrs={'class': 'input', 'placeholder': 'Digite um texto'}), 
            'heading': forms.TextInput(attrs={'class': 'input', 'placeholder': 'Digite um texto'}),  
            'serie': forms.ModelChoiceField(queryset=Série.objects.all()),  
            'text': forms.Textarea(attrs={'class': 'input',}),  
            'created_date': forms.DateTimeInput(attrs={'class': 'datepicker', 'type':'datetime','placeholder': 'Digite um texto'}),
            'published_date': forms.DateTimeInput(attrs={'class': 'datepicker', 'placeholder': 'Digite um texto'}),  
            'slug': forms.TextInput(attrs={'class': 'input', 'placeholder': 'Digite um texto'}),
            'tags': forms.TextInput(attrs={'class': 'chips chips-placeholder',}),
        }`

我读过的 Whosebug 中的一些帖子:

此致,

A.

终于找到解决方法了

同时使用 Django 和 Materialize 时要小心。

Material CSS 设置为与某些 一起使用,其中一些 需要 JavaScript 才能正常工作.

Django 中的表单以不同的 类 呈现,您需要使用 ID 而不是 类 来初始化 jQuery。

检查发生了什么:

  1. 删除所有 CSS 和样式引用(使用原始 HTML)
  2. 如果 form 被渲染,你的问题不在外键上

代码示例:

在呈现 forms.py 的模板上使用此代码,我找到了解决方案

<script>
  // datepicker for 
  $(document).ready(function () {
    $('#id_published_date, #id_created_date').datepicker();
  });
  // Select 
  $(document).ready(function () {
    $('select').formSelect();
  });
</script>