user3395936
user3395936

Reputation: 681

Update existing row in database in forms - Django

I have an existing entry in the database, and i want to check in my views.py if the entry already exists in the DB, if it does then the new values will replace the old data in that row, otherwise create a new row for that user. How can i do that?

#models.py
class Member(models.Model):
username = models.CharField(max_length=16, primary_key=True)
password = models.CharField(max_length=16)
profile = models.OneToOneField(Profile, null=True)
following = models.ManyToManyField("self", symmetrical=True)

class Message(models.Model):
user = models.ForeignKey(Member, related_name='%(class)s_user')
recip = models.ForeignKey(Member, related_name='%(class)s_recip')
pm = models.BooleanField(default=True)
time = models.DateTimeField()
text = models.CharField(max_length=4096)


def __str__(self):
    return self.username



#forms.py
class UploadFileForm(forms.ModelForm):
    class Meta:
        model = ProfilePic
        fields = ['text','thumbnail']

#models.py
class ProfilePic(models.Model):
    user = models.ForeignKey(Member, related_name='%(class)s_user', null=True)
    text = models.TextField(max_length=4096)
    thumbnail = models.FileField(upload_to='media', null=True)

#views.py
if request.POST:
username = request.session['username']
member_obj = Member.objects.get(pk=username)

    form = UploadFileForm(request.POST,request.FILES)
    profile_pic = form.save(commit=False) 

   **#checking if username already exists in the DB:**

    member_obj = Member.objects.update_or_create(username=username)

   **#if yes then replace data in the row with the new one,
     # if not create a new row**  

    profile_pic.user = member_obj
    profile_pic.save()

Upvotes: 1

Views: 2842

Answers (3)

Nivedita Deshmukh
Nivedita Deshmukh

Reputation: 309

Try this,

if request.method == 'POST':
    form = UploadFileForm(request.POST, request.FILES)
    if form.is_valid():
        cd = form.cleaned_data
        username = request.session['username']
        if Member.objects.filter(username=username).exists():
            member_obj = Member.objects.get(username=username)
            profile_pic = ProfilePic.objects.get(user=member_obj)
            profile_pic.user = member_obj
            # you can update other fields by using object.field_name (e.g. profile_pic.text = request.POST.get['text']
            profile_pic.save()
        else:
            ProfilePic.objects.create(user=username)
        return HttpResponse('success')
    else:
        return HttpResponse(form.errors)
else:
    form = UploadFileForm

Upvotes: 2

doru
doru

Reputation: 9110

You should change the queryset:

member_obj = Member.objects.get(pk=username)

to

member_obj = Member.objects.get(username=username)

if username = request.session['username'] is the username attribute of the user object. If you work with usernames (instead of ids) you have to enforce distinct usernames.

If you want to work with pk (id) you should store it in session and then the query would be:

user_id = request.session['id']
member_obj = Member.objects.get(pk=user_id)

Upvotes: 0

Agate
Agate

Reputation: 3232

As you did, update_or_create is here for that. However, you should use it as follow:

defaults = {} # Here you should specify the values that will be updated on the member object,
              # Or the default values to pass to the newly created instance

# Update or create return a tuple (object, created), created being a boolean
member_obj, created = Member.objects.update_or_create(username=username, defaults=defaults)

# This part seems correct to me
profile_pic.user = member_obj
profile_pic.save()

Upvotes: 0

Related Questions