Django - 多对多模型返回无

时间:2016-10-24 00:27:09

标签: python django django-models many-to-many

长时间听众,第一次海报。希望得到我的模型问题的一些帮助。

我和我的多对多关系都遇到了麻烦。当我提交表单时,我希望将用户的信息与他们创建的帖子相关联。我使用了多对多,因为我将有一个额外的功能,其他用户可以在同一次旅行中加入。

目前我的旅行表的数据创建正常,但我的用户没有链接到旅行ID,因此我无法在模板上显示他们的名字。

以下是我的代码。感谢任何帮助! 干杯

以下是我的models.py:

class User(models.Model):
    name = models.CharField(max_length=45)
    username = models.CharField(max_length=255)
    password = models.CharField(max_length=255)
    created_at = models.DateTimeField(auto_now_add=True)
    updated_at = models.DateTimeField(auto_now=True)
    objects = UserManager()

class Trip(models.Model):
    destination = models.CharField(max_length=45)
    description = models.CharField(max_length=255)
    datefrom = models.CharField(max_length=255)
    dateend = models.CharField(max_length=255)
    user = models.ManyToManyField(User)
    created_at = models.DateTimeField(auto_now_add=True)
    updated_at = models.DateTimeField(auto_now=True)

这是我的views.py:

def travels(request):
    user = User.objects.get(id=request.session['logged_user'])
    all_trips = Trip.objects.all().order_by('-id')
    user_trips = Trip.objects.filter(user=request.session['logged_user'])
    context = {
        "user_trips": user_trips,
        "all_trips": all_trips,
        "user": user,
    }
    return render(request, 'belt_exam/travels.html', context)

def addtrip(request):
    user_id = request.session['logged_user']
    createdtrip = Trip.objects.create(destination=request.POST['destination'], description=request.POST['description'], datefrom=request.POST['datefrom'], dateend=request.POST['dateend'])
    createdtrip.user.add(User.objects.get(id=user_id))    
    return redirect('/travels')

这是我的模板:

{% for alltrip in all_trips.all %}
    <tr>
        <td>{{alltrip.name}}</td>
        <td><a href="travels/destination/{{alltrip.id}}">{{alltrip.destination}}</a></td>
        <td>{{alltrip.datefrom}}</td>
        <td>{{alltrip.dateend}}</td>
        <td>
        <form class="" action="travels/destination/{{alltrip.id}}" method="POST">
        {% csrf_token %}
        <input type="submit" value="Join">
        </form>
        </td>
    </tr>
{% endfor %}

1 个答案:

答案 0 :(得分:2)

在第

user_trips = Trip.objects.filter(user=request.session['logged_user'])

您正在将会话中的用户ID与User对象进行比较。那样不行。正确的是

user_trips = Trip.objects.filter(user=user)

但是有一种更好的方式让用户旅行。对于每个关系,Django都会创建一个反向关系。该名称可以设置为related

ManyToManyField名称属性
user = models.ManyToManyField(User, related_name='trips')

现在你可以在目标模型上使用该属性作为对象管理器(如objects

user_trips = user.trips.all()