Django 使用 request.user.get_username() 填充隐藏输入

Ove*_*ass 2 python django django-models django-views python-3.x

我有一个模型:

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
Run Code Online (Sandbox Code Playgroud)

我有一个由 Crispy-Forms 渲染的相应模型表单和模型表单集:

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)
Run Code Online (Sandbox Code Playgroud)

我有一个建立在表单集之上的视图:

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)
Run Code Online (Sandbox Code Playgroud)

我希望由可以通过 访问的user当前用户名填充。在我的模板中正确执行并显示当前用户。但是,当我尝试自动填充字段并将数据发布到数据库时,记录未发布。我尝试将视图更改为:REMOTE_USERrequest.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')
Run Code Online (Sandbox Code Playgroud)

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

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

表单集保存更新:

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)
Run Code Online (Sandbox Code Playgroud)

第二个表单集保存更新:

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)
Run Code Online (Sandbox Code Playgroud)

Ala*_*air 6

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

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

然后在您看来,您可以form.instance.user在保存表单之前进行设置。

if form.is_valid():
    form.instance.user = request.user.get_username()
    form.save()
Run Code Online (Sandbox Code Playgroud)