【问题标题】:Django database relationDjango 数据库关系
【发布时间】:2022-01-04 19:37:27
【问题描述】:

我正在使用 django 在论坛上工作,我在从我拥有的模型类中访问用户全名和简历时遇到问题。我访问 user.username 或 user.email 没有问题,但不是来自 Author 类..

这是来自论坛应用程序中的models.py

User = get_user_model()

class Author(models.Model):
    user = models.ForeignKey(User, on_delete=models.CASCADE)
    fullname = models.CharField(max_length=40, blank=True)
    slug = slug = models.SlugField(max_length=400, unique=True, blank=True)
    bio = HTMLField()
    points = models.IntegerField(default=0)
    profile_pic = ResizedImageField(size=[50, 80], quality=100, upload_to="authors", default=None, null=True, blank=True)

    def __str__(self):
        return self.fullname

我的表单在用户应用程序中,我有一个个人资料更新站点,表单是这样的

from forums.models import Author

class UpdateForm(forms.ModelForm):

    class Meta:
        model = Author
        fields = ('fullname', 'bio', 'profile_pic')

然后这里是一些更新站点,但是没有什么让我可以访问生物或全名,我已经尝试了很多组合。我在这里迷路了..

{% block content %}
    <section class="section" id="about">
        <!-- Title -->
        <div class="section-heading">
            <h3 class="title is-2">Hey {{ user.username }}</h3>
            <div class="container">
                <p>{{  user.bio }}bio comes here</p>
            </div>
        </div>

这是来自用户应用的 view.py

from .forms import UpdateForm

def update_profile(request):
    context = {}
    user = request.user
    instance = Author.objects.filter(user=user).first()
    if request.method == 'POST':
        form = UpdateForm(request.POST, request.FILES, instance=user)
        if form.is_valid():
            form.instance.user = user
            form.save()
            return redirect('/')
    else:
        form = UpdateForm(instance=user)
    context.update({
        'form': form,
        'title': 'update_profile',
    })
    return render(request, 'register/update.html', context)

表单html

<form method="POST" action="." enctype="multipart/form-data">
                            {% csrf_token %}    
                            {{form|crispy}}
                            <hr>
                            <button class="button is-block is-info is-large is-fullwidth">Update <i class="fa fa-sign-in" aria-hidden="true"></i></button>
                        </form>

如果我缺少某些关系,请帮助

【问题讨论】:

  • 您能显示将上下文传递给模板的视图吗?
  • 添加了view.py

标签: python django database sqlite


【解决方案1】:

您的视图当前会在您每次“更新”模型时创建一个 Author 记录。我建议先清理数据库并删除所有作者。

然后您可以在这里将ForeignKey 转换为OneToOneField:这样我们就知道每个用户最多有一个Author

from django.conf import settings

class Author(models.Model):
    user = models.OneToOneField(
        settings.AUTH_USER_MODEL,
        on_delete=models.CASCADE
    )
    # …

现在我们可以更改视图以在没有记录的情况下创建记录,或者如果有记录则更新现有记录:

from .forms import UpdateForm

def update_profile(request):
    context = {}
    user = request.user
    instance = Author.objects.filter(user=user).first()
    if request.method == 'POST':
        form = UpdateForm(request.POST, request.FILES, instance=instance)
        if form.is_valid():
            form.instance.user = user
            form.save()
            return redirect('/')
    else:
        form = UpdateForm(instance=instance)
    context.update({
        'form': form,
        'title': 'update_profile',
    })
    return render(request, 'register/update.html', context)

在模板中,您可以为用户user 渲染相关Author 模型的数据:

{{ user.author.fullname }}
{{ user.author.bio }}

【讨论】:

  • NameError: name 'Author' is not defined 这是我必须导入的模型中的作者类还是 django 类?编辑:是的,谢谢:)
  • @MerrinX:是的,你需要在视图中导入模型。
  • 我现在唯一的问题是它不会更新配置文件,当我尝试时,它会更早,但正如你所说,它每次都会创建新记录,但它确实有效,现在我明白了没有错误,但它不会保存更新
  • @MerrinX: 你确定else 绑定的是request.method == 'POST' 而不是form.is_valid()?您是否更改了视图,如果是,请使用新视图编辑问题。
  • @MerrinX:对不起,我弄错了,表格中是instance=instance,而不是instance=user(2次)。
猜你喜欢
  • 2010-11-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-08-29
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多