将数据传递到表单(来自POST和url)

时间:2019-05-10 08:36:13

标签: django python-3.x

我不确定如何将数据从给定的对象(配置文件)和表单(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语句”运行了...

1 个答案:

答案 0 :(得分:0)

您正在尝试检索GET数据。

def newKeyword(request, profile_id):

,您可以通过这种方式检索该参数,但对于POST数据, 您可以使用;

request.GET.get('profile_id') # GET method
request.POST.get('profile_id') # POST method

,您无需为此编辑网址。

相关问题: Passing variable from django template to view