Bob Reynolds
Bob Reynolds

Reputation: 1009

Getting authenticated username in Django

I'm using Django's built in user who is in my application authenticates and uses some service. Now my problem is, I want to get current user's username and write it to database. Here I've used such method that mentioned User model as a ForeignKey, but it is assigning to database as an empty data. But I want to write current user's name. Here are my codes:

views.py:

@login_required(login_url='sign_in')
def upload_document(request):
    context = {}
    form = UploadDocumentForm()
    if request.method == 'POST':
        form = UploadDocumentForm(request.POST or None, request.FILES or None)
        if form.is_valid():
            form.save()
            return redirect('index')
    context = {'form':form}
    return render(request, 'upload_document.html', context)

models.py:

class OriginalDocument(models.Model):
    document = models.FileField(upload_to='static/original_document', blank=False)
    document_title = models.CharField(max_length=300)
    student_name = models.CharField(max_length=100)
    teacher_name = models.CharField(max_length=100)
    document_type = models.CharField(max_length=100)
    university = models.ForeignKey(University, on_delete=models.CASCADE)
    date_added = models.DateTimeField(auto_now_add = True)
    checked_by = models.ForeignKey(User, on_delete=models.CASCADE)

    def __str__(self):
        return self.document_title

forms.py:

class UploadDocumentForm(ModelForm):
    class Meta:
        model = OriginalDocument
        fields = '__all__'
        exclude = ['date_added', 'checked_by']

    def __init__(self, *args, **kwargs):
        super(UploadDocumentForm, self).__init__(*args, **kwargs)

Upvotes: 0

Views: 61

Answers (2)

Manan M.
Manan M.

Reputation: 1394

Then you have to write save_model into your admin.py as below...

class OriginalDocumentAdmin(admin.ModelAdmin):
    def save_model(self, request, obj, form, change):
        if not change:
            obj.checked_by = request.user
        obj.save()
admin.site.register(OriginalDocument, OriginalDocumentAdmin)

Or Try it with override save() method of form as below...

class UploadDocumentForm(ModelForm):
    class Meta:
        model = OriginalDocument
        fields = '__all__'
        exclude = ['date_added', 'checked_by']

    def __init__(self, *args, **kwargs):
        self.request = kwargs.pop('request', None)
        super(UploadDocumentForm, self).__init__(*args, **kwargs)

    def save(self, *args, **kwargs):
        obj = super(UploadDocumentForm, self).save(*args, **kwargs)
        if self.request:
            obj.checked_by = self.request.user
        obj.save()
        return obj

Upvotes: 0

Bob Reynolds
Bob Reynolds

Reputation: 1009

Finally, after an hours of searching I've found a package named django-currentuser (link is here) which is pretty simple to use and a project that I really wanted. This package helped me to get username of logged in user and use it as a field in model.

Upvotes: 1

Related Questions