【问题标题】:Create and UpdateView with foreign key related model in Django CBV在 Django CBV 中使用外键相关模型创建和更新视图
【发布时间】:2019-02-02 10:23:21
【问题描述】:

我有 1 个带有 2 个模型的应用程序“组合”,第 2 个具有第一个 FK,我需要(创建和更新)它的视图。我有第一个模型的完整 CRUD,但我不知道用 fk 模型得到相同的结果。我正在寻找两者的创建和更新视图。但我无法以专辑形式访问项目,因此从项目中选择 FK 以将相关专辑与创建的所有项目之一联系起来

models.py

from django.db import models
from django.contrib.auth.models import User
from ckeditor.fields import RichTextField

# Create your models here.

class Project(models.Model):
    user = models.ForeignKey(User, on_delete = models.CASCADE, default=1)
    name = models.CharField(verbose_name='Nombre del proyecto', max_length=200)
    client = models.CharField(verbose_name='Nombre del cliente', max_length=200)
    description = RichTextField(verbose_name='Descripción')
    start = models.DateField(verbose_name='Fecha de Inicio', null=True, blank=True)
    ending = models.DateField(verbose_name='Fecha de Finalización', null=True, blank=True)
    order = models.SmallIntegerField(verbose_name="Orden", default=0)
    created = models.DateTimeField(verbose_name='Fecha de creación', auto_now_add=True)
    updated = models.DateTimeField(verbose_name='Fecha de modificación', auto_now=True)

    class Meta:
        verbose_name = 'Proyecto'
        verbose_name_plural = 'Proyectos'
        ordering = ['-start', 'order']

    def __str__(self):
        return self.name

class Album(models.Model):
    project = models.ForeignKey(Project, on_delete = models.CASCADE)
    title = models.CharField(verbose_name='Título de la imagen', max_length=200, null=True, blank=True)
    image = models.ImageField(verbose_name='Imagen', upload_to='portfolio')
    created = models.DateTimeField(verbose_name='Fecha de creación', auto_now_add=True)
    updated = models.DateTimeField(verbose_name='Fecha de modificación', auto_now=True)

    class Meta:
        verbose_name = 'Imagen en el album'
        verbose_name_plural = 'Imágenes en el album'
        ordering = ['created']

        def __str__(self):
            return self.title

views.py

@method_decorator(staff_member_required(login_url='login'), name='dispatch')
class ProjectCreateView(CreateView):
    model = Project
    template_name = "core/project_create_form.html"
    form_class = ProjectCreateForm
    success_url = reverse_lazy('home')

@method_decorator(staff_member_required(login_url='login'), name='dispatch')
class ProjectUpdateView(UpdateView):
    model = Project
    template_name = "core/project_update_form.html"
    form_class = ProjectUpdateForm


@method_decorator(staff_member_required(login_url='login'), name='dispatch')
class ProjectDeleteView(DeleteView):
    model = Project
    template_name = "core/project_delete_form.html"
    success_url = reverse_lazy('home')

forms.py

class ProjectCreateForm(forms.ModelForm):

    template_name = 'core/project_create_form.html'

    class Meta:
        model = Project
        fields = [
            'name',
            'client',
            'description',
            'start',
            'ending',
            'order',
            ]

        widgets = {

            'name':forms.TextInput(
                attrs={
                    'class':'form-control'}),

            'client':forms.TextInput(
                attrs={
                    'class':'form-control'}),

            'description':forms.Textarea(
                attrs={
                    'class':'form-control'}),

            'start':forms.DateInput(
                attrs={
                    'class':'form-control'}),

            'ending':forms.DateInput(
                attrs={
                    'class':'form-control'}),

            'order':forms.NumberInput(
                attrs={
                    'class':'form-control'}),
        }


class ProjectUpdateForm(forms.ModelForm):

    template_name = 'core/project_update_form.html'

    class Meta:
        model = Project
        fields = [
            'name',
            'client',
            'description',
            'start',
            'ending',
            'order',
            ]

        widgets = {

            'name':forms.TextInput(
                attrs={
                    'class':'form-control'}),

            'client':forms.TextInput(
                attrs={
                    'class':'form-control'}),

            'description':forms.Textarea(
                attrs={
                    'class':'form-control'}),

            'start':forms.DateInput(
                attrs={
                    'class':'form-control'}),

            'ending':forms.DateInput(
                attrs={
                    'class':'form-control'}),

            'order':forms.NumberInput(
                attrs={
                    'class':'form-control'}),
        }

【问题讨论】:

  • 所以您希望在同一页面上同时拥有项目和专辑表单?
  • 是的,像这样:Example
  • 我可能无法将您带到那里,但这里有一些我保存的链接可以帮助我。 inlineformsetsmultiple forms.

标签: django django-models django-forms django-class-based-views


【解决方案1】:

我没有尝试过这个库,但它可能会解决你的问题,Django 中的一个常见问题是如何拥有一个视图,尤其是一个可以同时显示和处理多个表单的基于类的视图。 https://github.com/kennethlove/django-shapeshifter

【讨论】:

    猜你喜欢
    • 2018-11-07
    • 2013-11-22
    • 1970-01-01
    • 1970-01-01
    • 2020-08-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-10-14
    相关资源
    最近更新 更多