Django class-based UpdateView -
we using django 1.9.5. writing update company profile view. want have 2 fields on update profile page:
- company
name
, apikey
(generated dedicated function).
i want change field name
hands , save clicking button update. filed apikey
want have separated button automatically generate new key, save db , update page.
i overwriting post
method @ updateview
class. simething isn't working. please take @ code:
models.py:
class organization(models.model): name = models.charfield(_('organisation display name'), max_length=512, blank=true) apikey = models.charfield(_("api authentication key"), max_length=apikey_length, default=get_apikey)
where get_apikey
from django.utils.crypto import get_random_string apikey_prefix = "key-" apikey_length = 80 def get_apikey(): rnd_len = apikey_length - len(apikey_prefix) return "{}{}".format( apikey_prefix, get_random_string(rnd_len, "abcdefghijklmnopqrstuvwxyz0123456789") )
forms.py:
from django import forms crispy_forms.helper import formhelper, layout orgs.models import organization class orgprofileform(forms.modelform): def __init__(self, *args, **kwargs): super(orgprofileform, self).__init__(*args, **kwargs) self.helper = formhelper() self.helper.form_tag = false class meta: model = organization fields = ['name', 'apikey']
views.py
from django.views.generic.edit import updateview, baseupdateview orgs.forms import orgprofileform orgs.models import organization local.auth import get_apikey class orgprofileview(updateview): model = organization template_name = 'orgs/orgprofile.html' form_class = orgprofileform url_name = 'profile' success_url = '/' def get_object(self, queryset=none): org_obj = organization.objects.get(orgname=self.kwargs["orgname"]) return org_obj def post(self, request, *args, **kwargs): import ipdb ipdb.set_trace() if '_key' in request.post: org_obj = organization.objects.get(orgname=self.kwargs["orgname"]) org_obj.apikey = get_apikey() org_obj.save() self.object = org_obj return super(baseupdateview, self).post(request, *args, **kwargs)
template.html
{% extends "base.html" %} {% load i18n %} {% load staticfiles %} {% load crispy_forms_tags %} {% block title %}{% trans "organization profile" %}{% endblock title %} {% block header_title %}{% trans "organization profile" %}{% endblock header_title %} {% block content %} <form action="" method="post">{% csrf_token %} {% crispy form %} <input type="submit" value="{% trans 'generate new key' %}" name="_key"> <input type="submit" value="{% trans 'update form' %}" name="_update"> </form> {% endblock content %}
using _key
, '_update' want differentiate between 2 buttons , actions update name
, regenerate new apikey
.
ohh, have found way around. in post request updating apikey
need to:
- update
apikey
value in model , save it, - redirect request
views.py
class orgprofileview(updateview): model = organization template_name = 'orgs/orgprofile.html' form_class = orgprofileform url_name = 'profile' def get_object(self, queryset=none): org_obj = organization.objects.get(orgname=self.kwargs["orgname"]) return org_obj def post(self, request, *args, **kwargs): if '_key' in request.post: org_obj = organization.objects.get(orgname=self.kwargs["orgname"]) org_obj.apikey = get_apikey() org_obj.save() self.object = org_obj return super(baseupdateview, self).get(request, *args, **kwargs) else: self.object = self.get_object() return super(baseupdateview, self).post(request, *args, **kwargs)
Comments
Post a Comment