【问题标题】:Django Populate Hidden Input with request.user.get_username()Django 使用 request.user.get_username() 填充隐藏输入
【发布时间】:2017-11-07 20:58:41
【问题描述】:

我有一个模型:

class Alert(models.Model):
    entity = models.ForeignKey(Entity, on_delete=models.CASCADE, db_column='entity')
    user = models.CharField(max_length=12)
    #...More Fields
    def __str__(self):
        return '%s' % self.entity

我有一个对应的model form和crispy-forms渲染的model formset:

class AlertForm(ModelForm):
    class Meta:
        model = Alert
        fields = '__all__'
        widgets = {
            'user': HiddenInput(),
            'entity': ModelSelect2(url='eda', attrs={'data-minimum-input-length': 2}),

AlertFormSet = modelformset_factory(Alert, extra=1, exclude=(), form=AlertForm)

我有一个基于表单集的视图:

def alerts(request):
    helper = AlertFormsetHelper()
    if request.method == 'POST':
        formset = AlertFormSet(request.POST)
        for form in formset:
            if form.is_valid():
                if form.has_changed():
                    if form.is_valid():
                        form.save()
                        entity = form.cleaned_data['entity']
                        messages.success(request, 'SUCCESS: Alert for %s was dispositioned' % entity)
        return redirect('alerts')
    else:
        query = Alert.objects.filter(disposition='')
        paginator = Paginator(query, 12)
        page = request.GET.get('page')
        try:
            objects = paginator.page(page)
        except PageNotAnInteger:
            objects = paginator.page(1)
        except EmptyPage:
            objects = paginator.page(paginator.num_pages)
        page_query = query.filter(id__in=[object.id for object in objects])
        formset = AlertFormSet(queryset=page_query.order_by('entity'))
        context = {'objects':objects, 'formset':formset, 'helper':helper}
    return render(request, 'alerts/alerts.html', context)

我希望user 由当前REMOTE_USER 用户名填充,该用户名可以通过request.user.get_username() 访问。 user.get_username 在我的模板中正确执行并显示当前用户。但是,当我尝试自动填充字段并将数据发布到数据库时,记录不会发布。我尝试将视图更改为:

def alerts(request):
        helper = AlertFormsetHelper()
        if request.method == 'POST':
            formset = AlertFormSet(request.POST)
            for form in formset:
                if form.is_valid():
                    if form.has_changed():
                        if form.is_valid():
                            form.save()
                            entity = form.cleaned_data['entity']
                            user = request.user.get_username()
                            messages.success(request, 'SUCCESS: Alert for %s was dispositioned' % entity)
            return redirect('alerts')

我尝试创建一个正在保存的表单的新实例,应用用户操作,然后保存该实例。这也没有任何结果。

在将表单集中的表单保存到数据库之前,我应该如何访问当前用户并自动填充一个空白的隐藏字段?

Formset 保存更新:

if request.method == 'POST':
        formset = AlertFormSet(request.POST)
        if formset.is_valid():
            formset.instance.user = request.user.get_username()
            formset.save()
            entity = formset.cleaned_data['entity']
            messages.success(request, 'SUCCESS: Alert for %s was dispositioned' % entity)

第二个表单集保存更新:

if request.method == 'POST':
        formset = AlertFormSet(request.POST)
        if formset.is_valid():
            instances = formset.save(commit=False)
            for instance in instances:
                instance.user = request.user.get_username()
                instance.entity = instance.cleaned_data['entity']
                instance.save()
                messages.success(request, 'SUCCESS: Alert for %s was dispositioned' % entity)

【问题讨论】:

  • 您可以使用formset.save()(也许使用commit=False)稍微简化您的视图。您可以访问formset.changed_objects,因此您不必为每个表单检查form.has_changed()
  • 我最近几次尝试并未能完成此调整...如果您对我尝试更新我的问题有任何想法,请告诉我。否则我可以发布一个新问题。
  • 设置formset.instance 将不起作用,您需要更改单个表单或实例。您的第二次尝试看起来是正确的。你不需要做instance.entity = instance.cleaned_data['entity'] - instance.entity 应该已经设置好了。
  • 仍然会导致重定向而不向数据库提交任何内容。我会继续挖掘 - 非常感谢你的帮助
  • 您可能会得到奇怪的结果,因为您正在为 GET 请求而不是 POST 请求指定表单。这意味着对于发布请求,查询集默认为Alert.objects.all(),并且表单集无效,因为有很多表单“丢失”。请注意,通常的方法是在表单集无效时显示错误(这样更容易调试),并且仅在提交有效表单集时才重定向。

标签: python django python-3.x django-models django-views


【解决方案1】:

我认为您在这里不需要隐藏输入。我会使用不包含用户字段的表单。

class AlertForm(ModelForm):
    class Meta:
        model = Alert
        fields = ['entity', ...] . # don't include user
        ...

那么在你的视图中,你可以在保存表单之前设置form.instance.user

if form.is_valid():
    form.instance.user = request.user.get_username()
    form.save()

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-06-04
    • 2019-02-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-03
    • 2019-05-04
    相关资源
    最近更新 更多