我不确定如何将数据从给定的对象(配置文件)和表单(request.POST)传递到一个模型(多对多关系)。
我有两个模型:个人资料和关键字。用户可以定义许多配置文件(针对不同的主题),并且在每个配置文件中,他们可以定义许多关键字(稍后由搜寻器使用)。同一关键字可能存在于多个配置文件中,而一个配置文件可能包含多个关键字。
现在,我有一个向用户添加新配置文件的视图,在下一步中,我想向该特定配置文件添加添加关键字的视图。
我通过url传递了一个参数外键-profile_id-,并且已经从模型关键字构建表单。现在,我无法将它们都传递给我的函数。
models.py
class Profiles (models.Model):
id_profile = models.AutoField(primary_key=True)
user_id = models.ForeignKey(User, on_delete=models.CASCADE)
name = models.CharField(max_length=45)
description = models.TextField(max_length=120, default=' ')
class Keywords (models.Model):
id_keyword = models.AutoField(primary_key=True)
name = models.CharField(max_length=100)
id_profile = models.ManyToManyField(Profiles)
模板
<button class="btn btn-outline-danger" type="submit"> <a href="{% url 'new_keyword' profile_id=object.id_profile %}">new keyword </a></button>
urls.py
path('profile_detail/<int:pk>/', users_view.ProfileDetailView.as_view(), name = 'profile_detail'),
path('new_keyword/<profile_id>/', users_view.NewKeyword, name = 'new_keyword'),
views.py
def newKeyword(request):
form = NewKeyword(request.POST)
if request.method == 'POST':
form.is_valid()
form.save()
return redirect('profile')
return render(request, 'users/new_keyword.html', {'form': form})
现在我有
__init__() got an unexpected keyword argument 'profile_id'
我了解我必须以某种方式覆盖 init ()才能接受profile_id,但是我不确定如何。
好的,谢谢您的回答。我已经更改了代码,但是现在我遇到了另一个问题:由于数据未通过验证,因此无法创建关键字。
def newKeyword(request):
context = {}
context['id_profile'] = request.POST.get('id_profile', None)
form = NewKeyword(request.POST or None)
if request.method == 'POST':
form.is_valid()
obj = form.save(commit=False)
obj.save()
obj.id_profile.add(context['id_profile'])
obj.save()
return redirect('profile')
return render(request, 'users/new_keyword.html', {'form': form})
和上一页中的模板:
<form method="POST" name="newkeyword" value='keyword'>
<fieldset class="form-group">
<legend class="border-bottom mb-4"> New keyword </legend>
{{ form | crispy }}
</fieldset>
<div class="form-group">
<button class="btn btn-outline-danger" type="submit">create</button>
</div>
</form>
在单击页面配置文件上的一个按钮后(为了查看:正在创建关键字),就像使用POST方法发送参数一样,因此我的“ If语句”运行了...
答案 0 :(得分:0)
您正在尝试检索GET数据。
def newKeyword(request, profile_id):
,您可以通过这种方式检索该参数,但对于POST数据, 您可以使用;
request.GET.get('profile_id') # GET method
request.POST.get('profile_id') # POST method
,您无需为此编辑网址。