Django使用request.user.get_username()

时间:2017-11-07 20:58:42

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

我有一个模特:

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

我有一个由crispy-forms呈现的相应模型表单和模型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)

我有一个建立在formset之上的视图:

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_usernamedef 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') 在我的模板中正确执行并显示当前用户。但是,当我尝试自动填充字段并将数据POST到数据库时,不会发布记录。我尝试将视图更改为:

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)

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

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

Formset保存更新:

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保存更新:

Person

1 个答案:

答案 0 :(得分:3)

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

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()