【问题标题】:Django check to see if User.name is in database already -- match via user.name rather than user.idDjango 检查 User.name 是否已经在数据库中——通过 user.name 而不是 user.id 匹配
【发布时间】:2014-02-27 19:26:55
【问题描述】:

我有一个简单的个人 Django 项目,它允许某人通过在索引页面上提供用户名和消息来创建消息。然后,他们可以通过数据库中的该链接查看给定用户的所有消息。理想情况下,客人会键入他们的用户名和消息,如果用户名不在数据库中,则会创建它并保存消息。但是,如果它在数据库中,则该消息与该现有用户名相关联,当我查看该用户的所有消息时,旧消息和当前消息应该会显示出来。

我现在面临的问题是我无法找到当前消息并将其链接到现有用户名。例如

User: Josh
Message: Hello World

User: Josh
Message: Second time.

两个用户在数据库中都有单独的 ID,因此当我查看来自“Josh”的消息时,它只会给我一个或另一个。我希望他们在第二次输入 Josh 时链接起来,这样当我查看 Josh 时,所有消息都会显示出来。 Essentially, how do I match them via User.name rather than User.id?

型号

class User (models.Model):
    name = models.CharField(max_length=20)

    def __unicode__(self):              
        return self.name

class Message (models.Model):
    content = models.TextField(max_length=140)
    user = models.ForeignKey(User)
    time = models.DateTimeField()

    def __unicode__(self):              
        return self.content

views.py

def index (request):
    if request.method == 'POST':
        u = User(name=request.POST.get('user'))
        u.save()
        m = Message(content=request.POST.get('message'), user = u)
        m.save()
        return render_to_response('index.html', {
                'user': u,
                'message': m,
                }, RequestContext(request))
    else:
        u = User()
        m = Message()
        return render_to_response('index.html', {
                'user': u,
                'message': m,
                }, RequestContext(request))

def view_messages(request, user_name=None):
    if user_name:
        user = get_object_or_404(User,pk=user_name)
        return render_to_response('messages.html', {
            'user': user,
            'messages': Message.objects.filter(user=user)
            })
    else:
        return render_to_response('messages.html', {
            'messages': Message.objects.all(),
            })

index.html

<form action="{% url 'index' %}" id="user_form" method = "POST">
{% csrf_token %}
<input type="text" name="user" id="user" maxlength="20" placeholder="Username" onblur="return validUser(this)">
<br>
<br>
<textarea rows="4" cols="35" name="message"  id="message" maxlength="140" placeholder="Message goes here" onblur="return validMessage(this)"></textarea><br>
<input type="submit" value="Submit" onclick="return finalCheck()">
</form>

谢谢!

【问题讨论】:

    标签: python database django django-models


    【解决方案1】:

    您必须在定义类成员时设置primary_key=True 参数。否则,Django 会添加一个自动 ID 字段,如 here 所述。

    为你的模型类试试这个:

    class User (models.Model):
        name = models.CharField(max_length=20, primary_key=True)
    
        def __unicode__(self):
            return self.name
    

    【讨论】:

    • 当我这样做并尝试查看用户的消息时,它现在会显示所有用户消息。我应该如何尝试获取用户内容?在此之前,它是作为 /messages/ 完成的
    • 这取决于您的view_tweets 方法是如何定义的。我假设之前的查找将使用 id。现在,它必须带有用户名。
    • 对,所以我尝试将 user_id 替换为 user_name,但现在收到 NoReverseMatch 错误“使用参数 '(u'josh',)' 和关键字参数 '{}' 反转'messages'未找到。尝试了 1 种模式:['messages/(?P\\d+)?/'] "
    • 在原帖中添加了 view_messages
    • 新错误与您的 urls.py 中的 url 规则有关,而不是视图定义。
    猜你喜欢
    • 1970-01-01
    • 2013-01-18
    • 2021-10-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多