Django View classes and database selection

9 views
Skip to first unread message

Sören Mindorf

unread,
Oct 29, 2017, 8:41:10 AM10/29/17
to django...@googlegroups.com
Hi all,

I've two databases connected in my setup.
One default (sqlite) for Djano and one postgressql (pgsql, NOT managed) for
my postfix.

In my AddDomainView(CreateView) I can access the pgsql database and
I can add Domains to the pgsql-database but in my DeleteDomain(DeleteView)
I can't because the view will always try to find the table in the sqlite3 Database where it
not is.

Here parts of my code:

view.py
-----%<-----
# -*- coding: utf-8 -*-
import socket

from django.contrib import messages
from django.contrib.auth.decorators import login_required
from django.http.response import HttpResponseRedirect, Http404
from django.urls.base import reverse
from django.utils.decorators import method_decorator
from django.utils.translation import ugettext as _
from django.views.generic.edit import CreateView, DeleteView
from django.db.utils import IntegrityError
from vmail.domain.forms import CreateDomainForm
from vmail.main.models import Domains


class AddDomainView(CreateView):
    template_name = 'domain/add_domain.html'
    model = Domains
    form_class = CreateDomainForm

    @method_decorator(login_required)
    def dispatch(self, *args, **kwargs):
        return super(AddDomainView, self).dispatch(*args, **kwargs)

    def get_form(self, form_class=form_class):
        form = super(AddDomainView, self).get_form(form_class)
        form.fields['domain'].queryset = Domains.objects.using('pgsql').all()
        return form

    def form_valid(self, form):
        self.object = form.save(commit=False)
        try:
            socket.gethostbyname(self.object.domain)
        except socket.gaierror:
            success, level, msg = False, messages.ERROR, _('Base domain does not exist.')
        else:
            try:
                self.object.created_by = self.request.user
                self.object.save(using='pgsql')
                success, level, msg = True, messages.SUCCESS, _('Domain added.')
            except IntegrityError:
                success, level, msg = False, messages.WARNING, _('Domain already exists .')
        messages.add_message(self.request, level, msg)
        url = reverse('overview')
        return HttpResponseRedirect(url)

    def get_context_data(self, **kwargs):
        context = super(AddDomainView, self).get_context_data(**kwargs)
        context['nav_overview'] = True
        return context


class DeleteDomain(DeleteView):
    model = Domains
    template_name = 'domain/delete_domain.html'

    @method_decorator(login_required)
    def dispatch(self, *args, **kwargs):
        return super(DeleteDomain, self).dispatch(*args, **kwargs)

    def get_object(self, *args, **kwargs):
        obj = super(DeleteDomain, self).get_object(*args, **kwargs)
        if obj.created_by != self.request.user :
            raise Http404
        return obj

    def get_success_url(self):
        return reverse('overview')

    def get_context_data(self, **kwargs):
        context = super(DeleteDomain, self).get_context_data(**kwargs)
        context['nav_overview'] = True
        return context
----->%-----

settings.py
-----%<-----
DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.sqlite3',
        'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
    },
    'pgsql': {
        'ENGINE': 'django.db.backends.postgresql',
        'HOST': 'localhost',
        'PORT': '5432',
        'PASSWORD': 'xxxxx',
        'USER': 'vmailuser',
        'NAME': 'virtualmail',
        'OPTIONS': {
            'options': '-c search_path=public'
        },
    }
}
----->%-----

model.py:
-----%<-----
# -*- coding: utf-8 -*-
from django.db import models
from django.utils.translation import ugettext_lazy as _
from django.core.validators import RegexValidator


class Domains(models.Model):
    id = models.AutoField(primary_key=True,
                          unique=True)
    domain = (
        models.CharField(max_length=255,
                         blank=False,
                         null=True,
                         validators=[RegexValidator(
                             regex=r"([a-zA-Z0-9-_]+\.)+[a-zA-Z0-9-_]
                                     {2,}",
                             message=_("Invalid domain name")
                         )],
                         help_text=_('Please enter the email Domain 
                                     here')    
                         )
    )
    created_by = (
        models.CharField(max_length=255)
    )

    class Meta:
        managed = False
        db_table = 'domains'

    def __unicode__(self):
        return self.domain
----->%-----

So how can I select the right database in the class-view?
And please remember, the pgsql is unmanaged in the model class. ;)

Kind regards,
Sören
Reply all
Reply to author
Forward
0 new messages