长时间听众,第一次海报。希望得到我的模型问题的一些帮助。
我和我的多对多关系都遇到了麻烦。当我提交表单时,我希望将用户的信息与他们创建的帖子相关联。我使用了多对多,因为我将有一个额外的功能,其他用户可以在同一次旅行中加入。
目前我的旅行表的数据创建正常,但我的用户没有链接到旅行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 %}
答案 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()