将我的用户名字段从CharField更改为ForeignKey

时间:2017-01-27 08:44:11

标签: python django django-models

我被告知建议使用ForeignKey(User)作为用户名字段,所以我现在尝试实现。但是我无法从当前的Charfield()转换为ForeignKey()字段。

下面的代码显示了我当前CharField()如何用于协助ajax调用。它目前的工作原理是点击用户名,该用户名点击该用户名的HTML,然后通过搜索CharField()这样profile = Profile.objects.get(username=username_clicked)来查看.get()任何个人资料。顺便说一下,点击该用户名的HTML来自另一个Charfield()author,这是我的评论模型中有人发表评论的字段。因此,ajax调用会打开一个小型配置文件框,其中包含用户点击的一些详细信息。这是我的代码:

个人资料模型

class Profile(models.Model):
    username = models.CharField(max_length=32, default='AnonymousUser')
    age = models.IntegerField(default=0)
    points = models.IntegerField(default=0)

    def __str__(self):
        return self.username

JS

$('a.username').on('click', function() {

    var username = $(this).html();
    var url = "/raise_profile/";

    $.ajax({
        type: 'GET',
        url: url,
        data: {
            username_clicked: username,
            csrfmiddlewaretoken: $("input[name='csrfmiddlewaretoken']").val()
        },
        success: function (data) {
            $('.profile_username').html(data.username);
            $('.profile_age').html(data.age);
            $('.profile_points').html(data.points);

        }
    })
});

查看

def raise_profile(request):
    username_clicked = request.GET.get('username_clicked')
    if request.is_ajax():
        profile = Profile.objects.get(username=username_clicked)
        profileAge = profile.age
        profileUsername = profile.username
        profilePoints = profile.points
        return JsonResponse({'age': profileAge, 'username': profileUsername, 'points': profilePoints})

评论模型

class Comment(models.Model):
    comment_text = models.TextField(max_length=350, blank=True, null=True)
    author = models.CharField(max_length=120, blank=True)

评论模板

<h3><a class="username">{{ i.author }}</a></h3>

有人可以告诉我如何更改当前进程,以便我可以使用ForeignKey()而不是CharField()作为我的用户名/作者字段吗?我被告知在这种情况下使用ForeignKey()会改善功能。

此处还有我的评论功能,其中包括添加author字段(评论人的用户名,CharField()):

def user_comment(request):
    if request.is_ajax():
        comment = CommentForm(request.POST or None)
        ajax_comment = request.POST.get('text') #the comment
        id = request.POST.get('id')

        if comment.is_valid():
            comment = Comment.objects.create(comment_text=ajax_comment, author=str(request.user), destination=id)
            comment.save()

            username = str(request.user)
            return JsonResponse({'text': ajax_comment, 'username': username})

1 个答案:

答案 0 :(得分:0)

为什么要使用CharField()。一个更好的解决方案是将Comment模型中的作者作为User的外键。现在,您使用的是<a>代码,请使用其href属性来保存指向作者个人资料的网址。简单干净。

例如,

class Comment(models.Model): text = field author = models.ForeignKey(User)

现在,<a>可以是<a href="/url_to_user_profile/id_of_author/">Author Name<a/>。当用户单击此锚标记时,获取其href并根据传递的id显示作者配置文件。

修改

从下面的评论中,您不希望页面刷新,因此您的点击处理程序就像

$("a").on("click", "function(event){
     event.preventDefault();
     //Make an ajax call here
});