How to change a user’s password in Django

In order to let Django users to change their own passwords, it is necessary to provide them with an interface, that is not “admin”. Following is a bare bone sample for the change view.

One item of importance and the reason I am writing this post is that, in most (maybe all) documents and samples I had access to, login() call (at 48th line of my view sample) after saving user instant, was not mentioned. That is required, because when you overwrite current request’s user’s records, you also need to relogin current user again, as credentials needed to be renewed in such situations.

View sample:

#coding: UTF-8
from django.shortcuts import render
from django.contrib.auth import authenticate, login, logout
from django.http.response import HttpResponseRedirect
from django.urls import resolve, reverse
from django.contrib.auth.models import User
from django.contrib.auth.decorators import login_required
from django.core.exceptions import ObjectDoesNotExist

from project.settings import LOGIN_URL

from cuser.middleware import CuserMiddleware

@login_required
def PassView(request):
    template_name='ServiceApp/pass.html'
    if request.method=="POST":
        current=request.POST['current']
        password_1=request.POST['password_1']
        password_2=request.POST['password_2']
        prob_mismatch=False
        prob_length=False
        prob_current=False
        prob_user_ex=False
        error_message=[]
        if password_1!=password_2:
            prob_mismatch=True
            error_message.append(u'New Passwords do not match')
        if password_1.__len__()<9:
            prob_length=True
            error_message.append(u'New password must be at least 9 characters long')
        try:
            user=User.objects.get(username=CuserMiddleware.get_user().__str__())
        except ObjectDoesNotExist:
            prob_user_ex=True
            error_message.append('Our user has experienced an existential crisis')
        if user.check_password(gecerli)==False:
            prob_current=True
            error_message.append(u'Current password given, do not match records)
        if prob_current or prob_length or prob_mismatch or prob_user_ex:
            context={
                'error_message':error_message,
                }
            return render(request,template_name,context)
        else:
            user.set_password(password_1)
            user.save()
            login(request,user)
            return HttpResponseRedirect(reverse('main_screen'))
    else:
        context={
            'error_message':error_message,
            }
        return render(request,template_name,context)

Jon Postel’i hatırlamak

Bugün Jon Postel’in ölüm yıl dönümü. İnsanları yılda bir kere hatırlamak bile zor gelirken, Postel’i arada geçen zamanda yirmi kere hatırlamam gerekiyordu, kaç kere becerdim bunu bilmiyorum. Internet’in oluşumunda ne seviyede önemli bir insan olduğunu anlatmak zor. Bunu okumak ise bilmeyenlere imkansız, bilenlere gereksiz.

Türkçe’deki “kahraman” kavramımız çok buraya uymasa da Postel kahramanımdı benim, Ritchie, Diffie ve Tanenbaum ile birlikte. Postel ile ilgili neyin beni en çok etkilediğini söylemek kolay değil. Ya, ben yıllarca IANA’yı kocaman bir organizasyon sanmışken, aslında çok uzun süre Jon’un tek başına ve olması gerektiği gibi yürüttüğü bir iş olduğunu anlamamdır, ya ISOC’un bir numaralı üyesi olmasıdır, ya da belki daha hüzünlü şekilde hiç bir zaman Jon olamayacağımı ölümüyle anlamış olmam…

Neyse, aralarındaki imaj farkına rağmen, Vint Cerf’ten daha iyi anlatmak mümkün değil, şunu okumakta fayda var: RFC 2468 Bu RFC yıllarca masamın üstünde, yanında, duvarımda asılı kaldı. En son, Internet’i bilmeyip, sadece sömüren birileri sebebiyle, taa okuldan beri sakladığım printout kaybolunca yenisini basmak istemedim. Önemli olan kağıtta değil kafada ve kalpte taşınan sonuçta.

How to switch a Django form in admin environment depending on Model’s instant status

To switch a Django form in admin environment, depending on Model’s status or any arbitrary environmental criteria, you need to override get_form() method of ModelAdmin. The requirement behind switching form can vary from application to application. Most simple scenario can be that you need one form for adding new instances and another for editing existing instances of the same Model. Easiest way in an overridden get_form method is to check if ModelAdmin is being called for a new object, or an existing one. It is also naturally possible to check attributes in case of an existing Model, or to check any external value, condition in either cases. As a very bare bone sample please see following code.

#coding: UTF-8
from django.contrib import admin
from django import forms

from .models import Person

class PersonForm(forms.ModelForm):
    class Meta:
        model=Person
        fields=['first_name','last_name','password',]
        widgets= {
                'password': forms.PasswordInput(),
            }
    def clean(self):
        password=self.cleaned_data.get('password')
        fname=self.cleaned_data.get('first_name')
        lname=self.cleaned_data.get('last_name')
#
# ..........................................
#
        return self.cleaned_data

class PersonAdmin(admin.ModelAdmin):
#    form=PersonForm
    c_fields=(
            ('first_name','last_name',),
            )
    a_fields=(
            ('first_name','last_name',),
			('password',),
            )
    readonly_fields=('account',)
    def add_view(self, request, form_url='', extra_context=None):
        self.fields=self.a_fields
        return admin.ModelAdmin.add_view(self, request, form_url=form_url, extra_context=extra_context)
    def change_view(self, request, object_id, form_url='', extra_context=None):
        self.fields=self.c_fields
        return admin.ModelAdmin.change_view(self, request, object_id, form_url=form_url, extra_context=extra_context)
    def get_form(self, request, obj=None, **kwargs):
        if obj is None:
            return PersonForm
        else:
            return super(PersonAdmin, self).get_form(request, obj, **kwargs)

admin.site.register(Person,PersonAdmin)

There is one important issue that needs to be noted. It is common practice to use forms statically by declaring a form=PersonForm value in ModelAdmin, as the remarked line shows. Also it is common practice to leave Meta value for field list fields=[] empty in forms called this way. However when you override get_form(), you also override handler for that empty value, which is crucial for form’s operation. So you need either simply to declare your values explicitly in the form itself fields=['first_name','last_name','password',] as this or develop your own get_form() further to put those values there. First option is simpler IMHO.

Sorumluluk

Adı lazım olmasa da benim için önemli bir arkadaşım sık sık beni eleştirir. Özet olarak “kendini karşındakinin yerine koymayı bırak, o bunu zaten yapacak” şeklinde özetlenebilir bu eleştirisi. Bunu iş görüşmesinde “en ciddi kusurunuz nedir?” diye sorulunca “şirketten çıkmayı sevmem, hep çalışırım” diyen geri zekalılarla rekabet etmek adına yazmıyorum.

Bizim meslekte “genellemeler genel olarak yanlıştır” yaklaşımı genel olarak doğrudur! Bu kapsamda düşünerek; Bilgisayarlarla çalışmak, bilgisayarlarla bir şeyler gerçekleştirmeye çalışmak ancak belli bir düşünce yapısındaki insanların çok sorun yaşamadan sağlıklı olarak yapabildikleri bir şey. Daha ötesi benim uzmanlık alanım uzun süre network yönetimi oldu. Bir keresinde haftada bir iki kereyi aşmamasını herkesin umduğu şekilde birbirimizi öldürmemeye çalıştığımız bir arkadaşıma, boynunu sıkarken söylediğim gibi “benim bilgisayarlarımın keyboard, mouse ve monitörü olmadı” çok uzun süre boyunca. Bu şekilde bir çalışma ortamında, insanın doğal yapısı da, bilinçli olarak kendini geliştirdiği yön de empatiyi insanlar yerine makinalarla kurmaya doğru evriliyor. Bu ne şaşırtıcı, ne de çoğu insanın sandığı kadar rahatsız edici.

Sıkıntı şurada doğuyor: Bir noktada insan ilişkileri, insan yönetimi işin teknik yönetiminden daha önemli hal alıyor. O noktaya gelindiğinde gereken değişikliğin boyutu büyük. Bunun için ihtiyaç duyulan kaynaklar ve destek her zaman bulunmayabiliyor. Ben şanslıydım, belki gereğinden fazla hatta. Oldukça fazla empati gelişimi, çatışma yönetimi v.s. eğitimi aldım, bana o eğitimleri aldırıp kendilerini bu ihtiyacın üzerinde gören yöneticilerimin arkalarını da çok topladım. Belki bu sebeple, başkalarının sorumluluğunu taşımaya yönelik bir alışkanlık da geliştirdim.

Şu aralar anlıyorum ki, insanın arkadaşları için endişelenmesi, onların dertlerini dert etmesi doğal. Ama bu “sorumluluğu” genişletirken abartmamak gerekiyor. Arkadaş zannettiğimiz herkes arkadaş olmayabiliyor. Biri aylar önce demişti ki “aradan iki üç yıl geçmeden arkadaş olunmuyor”. Bu bence o kadar kolay değil, kriterler bu kadar basit değil arkadaşlıkta. Ama ölçülebilir bir kriter de yok değil. Bunu gayet net şekilde ifade etmek mümkün. Arkadaş olmayan bir tanıdık insanın hayatını acıtıyor. Bu acıyı paylaşan ve azaltan kişi ise gerçekten arkadaş olan insan.

Why is Linux so buggy?

I guess you had lots of quasi or not fanboi replies about your lack of talent, intelligence and aptitude etc. already. So I will leave that part to those people. What you are mentioning in your question details was, now hidden very successfully by Quora bot, Desktop stability problems and comparison with Windows. Windows is a desktop GUI carried by a kernel built on VMS architecture (which was more suitable to desktop than Unix even decades ago) and some not so advertised unix-like structures. Linux is, unfortunately and despite all the efforts by people who really know what they are doing, not suitable as a desktop platform for regular people (who we like to call as “User”, you can check several references for “User” designation in a.s.r archives, Jargon file, and naturally Tron sub-culture. I especially recommend some reading about L.A.R.T.) . There are exceptions to this case; Especially, Chrome OS, Debian and Mint. If you are a regular user, I recommend these options, all the rest are for computer pros with slightly masochistic tendencies.

. TR MOL