1

Meta: unique_together = ['slug', 'person'], person は外部キー フィールドを持つモデルがあります。私のフォームでは、slug フィールドを入力したくありません。child_name フィールドから入力したい。私は次のように試しました:

class ChildForm(SlugCleanMixin, forms.ModelForm):

    class Meta:
        model = Child
        fields = ('child_name','slug','child_birth_date','blood_group')

        def slug(self):
            return slugify(self.child_name)

ただし、スラッグ フィールドは child_name から自動入力されません。また、モデルで pre_save を次のように使用してみました。

def create_slug(instance, new_slug=None):
    slug = slugify(instance.child_name)
    if new_slug is not None:
        slug = new_slug
    qs = Child.objects.filter(slug=slug).order_by("-id")
    exists = qs.exists()
    if exists:
        new_slug = "%s-%s" %(slug, qs.first().id)
        return create_slug(instance, new_slug=new_slug)
    return slug


def pre_save_post_receiver(sender, instance, *args, **kwargs):
    if not instance.slug:
        instance.slug = create_slug(instance)

pre_save.connect(pre_save_post_receiver, sender=Child)

しかし、私の目的を達成するものは何もありません。どうすればそれができますか?どんな助けでも大歓迎です。

私の SlugCleanMixin:

class SlugCleanMixin:
    """Mixin class for slug cleaning method."""

    def clean_slug(self):
        new_slug = (
            self.cleaned_data['slug'].lower())
        if new_slug == 'create':
            raise ValidationError(
                'Slug may not be "create".')
        return new_slug

私の見解:

class ChildrenCreate( ChildrenGetObjectMixin,
    PersonContextMixin, CreateView):
    template_name = 'member/children_form.html'
    model = Child
    form_class = ChildForm


    def get_initial(self):
        person_slug = self.kwargs.get(
            self.person_slug_url_kwarg)
        self.person = get_object_or_404(
            Person, slug__iexact=person_slug)
        initial = {
            self.person_context_object_name:
                self.person,
        }
        initial.update(self.initial)
        return initial

モデル:

class Child(models.Model):
    person = models.ForeignKey(Person, on_delete=models.CASCADE)
    child_name = models.CharField(max_length=150)
    slug = models.SlugField(max_length=100)
    child_birth_date = models.DateField()
    blood_group = models.CharField(max_length=5, blank=True)

    objects = ChildrenManager()


    class Meta:
        verbose_name_plural = 'children'
        ordering = ['-child_birth_date']
        unique_together = ['slug', 'person']
4

2 に答える 2

0

いくつかのアプリケーションで使用したように、スラッグを生成するためにこのパッケージをチェックアウトしてみて、素晴らしいと思います:

https://github.com/un33k/django-uuslug

これらは、使用方法の簡単な例を提供します。これをモデルに適応させると、次のようになります。

class Child(models.Model):
    child_name = models.CharField(max_length=150)
    slug = models.SlugField(max_length=100)
    ...

    def save(self, *args, **kwargs):
        self.slug = uuslug(self.child_name, instance=self)
        super(Child, self).save(*args, **kwargs)  
于 2016-11-10T15:16:03.303 に答える