【问题标题】:Django - how add User specific Items?Django - 如何添加用户特定项目?
【发布时间】:2022-01-20 14:05:30
【问题描述】:

早安 Stackoverflow, 用户应该能够添加多个标题,而不是总是覆盖一个添加的标题。

\\views.py

def edit_profile(request):

    try:
        profile = request.user.userprofile
    except UserProfile.DoesNotExist:
        profile = UserProfile(user=request.user)

    if request.method == 'POST':
        form = UserProfileForm(request.POST, instance=profile)
        if form.is_valid():
            form.save()
            return redirect('/test')
    else:
        form = UserProfileForm(instance=profile)

        return render(request, 'forms.html', {'form': form, 'profile': profile})

\\models.py

class UserProfile(models.Model):
    user = models.OneToOneField(User, on_delete=models.CASCADE)
    title = models.CharField(max_length=1024)

    def __str__(self):
        return str(self.title)

\\forms.py

class UserProfileForm(forms.ModelForm):

    class Meta:
        model = UserProfile
        fields = ('title',)

然后用户在网站上有一个表单,他可以在其中添加特定的标题。

然而,直到现在,每次用户填写标题表单时,数据库中的值都会被覆盖。 应该是: 在表单中添加新标题时,只需将其添加到其中即可。

最后,我应该有可能在 HTML 模板中使用 Foor 循环来显示相应用户的所有添加标题。

你知道怎么做吗?

【问题讨论】:

  • 对于您的用户模型,您是使用OneToManyField 还是OneToOneField 来存储userprofile
  • UserProfile 有OneToOneField,后面也一样是多余的。
  • @dbo123 不知道,我只是用了基本的用户模型
  • @NixonSparrow 需要什么改变?

标签: python django


【解决方案1】:

如果您使用的是关系数据库,则单个字段真正不支持此功能。不过,如果您真的愿意,您可以使用 JSON 字段来完成这项工作。

但是,为标题使用单独的表格可能更好。

为此,您需要创建一个新的Title 对象,例如:
class Title(models.Model):

然后,使用ForeignKey 创建多对一关系:

class Title(models.Model): 
    text = models.CharField(max_length=1024)
    user_profile = models.ForeignKey(UserProfile, on_delete=models.CASCADE)

on_delete 方法是必需的。如果 UserProfile 被删除,这个特定的将删除与 UserProfile 关联的所有 Title。

现在,如果您想将标题对象与 UserProfile 相关联,您可以这样做:

profile = UserProfile(user=request.user)
title = Title.objects.create(text='My Very First Title', user_profile=profile)

有关 Django 中多对一关系的更多信息:https://docs.djangoproject.com/en/4.0/topics/db/examples/many_to_one/

【讨论】:

    【解决方案2】:

    您可以创建新模型并使用 ForeignKey 字段分配新模型。

    models.py:

    class UserProfile(models.Model):
        user = models.OneToOneField(User, on_delete=models.CASCADE)
    
        def __str__(self):
            return ', '.join([title for title in self.titles.all()])
    
    
    class UserTitle(models.Model):
        title = models.CharField(max_length=1024)
        userprofile = models.ForeignKey(UserProfile, on_delete=models.CASCADE, related_name='titles')
            
        def __str__(self):
            return self.title
    

    views.py:

    def edit_profile(request):
        ...
        if request.method == 'POST':
            ...
            if form.is_valid():
                form.instance.userprofile = request.user.userprofile
                form.save()
                return redirect('/test')
        ...
    

    admin.py:

    from django.contrib import admin
    from your_app.models import UserProfile
    
    class UserProfileAdmin(admin.ModelAdmin):
        list_display = ['id', 'user', '__str__']
    
    admin.site.register(UserProfile, UserProfileAdmin)
    

    settings.py:

    INSTALLED_APPS = [
        ...
        'your_app',
        ...
    

    在模板中,只使用 for 循环:

    {% for title in user.userprofile.titles.all %}
        {{ title }}
    {% endfor %}
    

    或者如果您只需要单个字符串中的用户标题:

    {{ user.userprofile }}
    

    【讨论】:

    • 但是views.py 长什么样子?
    • 对不起,我会在第二个添加它:)
    • 还不工作,管理仪表板中用户标题中的“用户:”为空
    • 刚刚编辑,如果这没有帮助,我会在几个小时内提供更多帮助:)
    • 非常感谢,但这会带来比以前更多的错误。管理仪表板中的“用户:”为空,我无法再访问该站点“视图 usertest.views.edit_profile 未返回 HttpResponse 对象。它返回 None。”等等
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-05-07
    • 1970-01-01
    • 1970-01-01
    • 2010-11-18
    • 2016-05-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多