Расширение профиля пользователя django

в Django я по прежнему новичок, но что-то стараюсь понять и запомнить.

стояла задача расширить профиль пользователя дополнительными полями, статей на эту тему пресс и малелькая тележка, но не получалось, то у кого-то на сайте парсер html сильно злой и код надо было переписывать, у кого-то были ошибки в примерах и т.п.

но как-то оно получилось, попробую собрать все мысли в кучу в эту статью.

Многие знают о django-registration и вот от автора этого замечательного приложения существует django-profiles котором я и воспользовался.

устанавливаем django-profiles

easy_install django-profiles

в models.py создадим модель профиля, которая наследуется от штатной User и добавим в ней нужное нам поле

from django.contrib.auth.models import User
...
...
class UserProfile(models.Model):
    # поле для связки со встроенной моделью пользователя Django
    user = models.ForeignKey(User, unique=True)
    # наше новое поле
    about = models.TextField(blank=True)

Далее в settings.py надо указать кто будет новым AUTH_PROFILE_MODULE

AUTH_PROFILE_MODULE = 'list.UserProfile'

где list это ваше приложение в котором расположена модель расширяющая пользователя

в принципе на этом можно закончить, ибо обращаться теперь можно к

{{ user.get_profile.about }}

только нужно обратить внимание что надо пользоваться не context а RequestContext
и указать это в
TEMPLATE_CONTEXT_PROCESSORS файла settings.py

TEMPLATE_CONTEXT_PROCESSORS = (
     ...
     'django.contrib.auth.context_processors.auth',
     ...
     )

но мы идём дальше

Теперь нам надо подключить django-profiles для просмотра\редактирования профиля

в файле urls.py
подключаем

    ...
    (r'^profiles/', include('profiles.urls')),
    ...

в settings.py также подключим приложение

INSTALLED_APPS = (
     ...
     'profiles',
     )

теперь создадим таблицы в базе

python manage.py syncdb

приложение profiles использует вот такие шаблоны

    profiles/create_profile.html
    profiles/edit_profile.html
    profiles/profile_detail.html
    profiles/profile_list.html

по названию понятно что к чему

для начала отредактируем edit_profile.html

{% extends "base.html" %}
{% block title %}Edit Profile{% endblock %}
 
{% block content %}
<h1>Edit contact info for {{ user }} </h1>
 
<form method="POST" action="">
    {{ form }}
    <input type="submit" name="submit" value="Update" id="submit">
</form>
 
{% endblock content %}

сохраняем, теперь можно обратиться к /profiles/edit/ то должно открыться форма редактирования профиля.

бывают ситуации, что в профиле есть какие-то поля, что запрещено редактировать пользователю, реализуется это довольно просто

создаём класс формы, наследуемой от общей формы, в котором перечисляем, то что нам исключить от вывода пользователю
forms.py

from django.db import models
from django.forms import ModelForm
from PROJ.apps.APP.models import UserProfile

.........
class ProfileForm(forms.ModelForm):
  class Meta:
      model = UserProfile
      exclude = ('user','last_name',)

from PROJ.apps.APP.models import UserProfile
проект и приложение где расположена расширенная модель

теперь в urls.py надо указать, что страницу редактирования профиля надо открывать с нужной нам формой

from PROJ.APP.forms import ProfileForm
........
    ('^profiles/edit', 'profiles.views.edit_profile', {'form_class': ProfileForm,}),
    (r'^profiles/', include('profiles.urls')),
.......

Должно получиться примерно так.. проверяем на странице редактирования профиля (/profiles/edit/).

Теперь сделаем страницу отображения профиля profile/profile_detail.html

вывести можно что угодно из профиля вот так

<p><strong>Address 2:</strong><br>{{ profile.address2 }}</p>

где address2 это дополнительное поле
список пользователей с профилями можно вывести вот так

profiles/profile_list.html

{% extends "base.html" %}
{% block content %}
<h1>Список пользователей</h1>
<br/><br/>
    {% for p in object_list  %}
<a href="{% url profiles_profile_detail p.user %}">{{ p.user }}</a>
{% endfor %}
{% endblock %}

Теперь задача такая, сейчас профиль и пользователь живут почти своей жизнью, при регистрации пользователя профиль сам не создаётся это мы сейчас и решим сигналами.

в models.py добавим

from django.db.models import signals
from bucket.signals import create_profile
 
# When model instance is saved, trigger creation of corresponding profile
signals.post_save.connect(create_profile, sender=User)

создадим файл, если он не создан signals.py:

def create_profile(sender, instance, signal, created, **kwargs):
    """When user is created also create a matching profile."""

    from PROJ.apps.APP.models import UserProfile

    if created:
        UserProfile(user = instance).save()
        # Do additional stuff here if needed, e.g.
        # create other required related records

вот и всё, при регистрации нового пользователя автоматически будет создаваться к нему профиль, если у вас уже сейчас много пользователей, то создать для каждого профиль можно вот так

$ python manage.py shell
 
from django.contrib.auth.models import User
from bucket.models import Profile
 
users = User.objects.all()
for u in users:
     try:
          p = u.get_profile()
     except p.DoesNotExist:
          Profile(user = u).save()

ещё коснусь вопроса редактирования своего email в профиль, пока ещё не совсем разобрался с этим.

пока есть только пример, делается это анналогично через forms.py

class ProfileForm(ModelForm):
 
    def __init__(self, *args, **kwargs):
        super(ProfileForm, self).__init__(*args, **kwargs)
        try:
            self.fields['email'].initial = self.instance.user.email
            # self.fields['first_name'].initial = self.instance.user.first_name
            # self.fields['last_name'].initial = self.instance.user.last_name
        except User.DoesNotExist:
            pass
 
    email = forms.EmailField(label="Primary email",help_text='')
 
    class Meta:
      model = Profile
      exclude = ('user',)        
 
    def save(self, *args, **kwargs):
        """
        Update the primary email address on the related User object as well.
        """

        u = self.instance.user
        u.email = self.cleaned_data['email']
        u.save()
        profile = super(ProfileForm, self).save(*args,**kwargs)
        return profile

надеюсь вернусь к этому вопросу

fsck.ext4: Memory allocation failed while retrying to read bitmaps for /dev/md0 e2fsck: aborted

Вот такой заголовок текст мне кинул мой NAS на debian выполняющий роль Бэкап хранилища…

fsck.ext4: Memory allocation failed while retrying to read bitmaps for /dev/md0 e2fsck: aborted

При этом отказывался грузиться, потерю бэкап сервера я заметил не сразу, может недельку без него прожил.. а не дай бог в это время что-то случилось?

так вот гугл толком ничгео не сказал, но если прочитать сообщение стало понятно, что он не смог вгрузить битовую карту 4Тб хранилища из-за мелкого размера оперативки(500) и swap(100!!!)
Хотя разметку диска дебиан делал автоматически.
так вот ладно грузимся дальше начинаем понимать, вижу что кончается опера и ивсё виснет htop не успевает показать что swap тоже кончается, пробую увеличить swap

создаю файл на 1Гб

dd if=/dev/zero of=/swapfile ibs=10485760 count=100

создаю файловую систему

mkswap /swapfile

подключаю новый файл как файл подкачки

swapon /swapfile

вот так смотрю что у меня с подкачкой?

# swapon -s
Filename                                Type            Size    Used    Priority
/dev/sda5                               partition       92152   37880   -1
/swapfile                               file            981296  144     -2

ну и всё запускаю заново проверку FS и она продолжается успешно…

Маленькая точка в SAPE

И так, господа, покажу вам ацки мотивирующий скрин с моей учётки в сапе.

Вот такая сухая циферка. за какой срок? можно в моём блоге посмотреть прошлые записи, я думаю что-то в районе года.

кто-то скажет мало, кто-то скажет много. каждый решит сам.

PS недавно ко мне постучалась ещё одна «сапа» и предложила сотрудничать с ними. предложили фиксированную плату в месяц, я согласился, посмотрим что из этого получится, о результатах напишу, скоро пройдёт первый месяц ;)

Radio Tray (плеер для online Radio) + Проблема с кодировкой

Люблю я всякие мелкие но страшно полезные утилитки, лёгкая, простоя, умеет делать 1 вещь, но делает это отлично!

и так
Radio Tray

Сидит в трее и афигенно играет радио, отличная буферизация, написана на питоне использует оч популярную библиотеку потокового воспроизведения.

скрин

под современными убунтами последнюю версию можно установить вот так

sudo add-apt-repository ppa:eugenesan/ppa
sudo apt-get update
sudo apt-get install radiotray

дальше в каталоге мультимедии у нас появится данная пиктограмма, запускаем, добавляем любимое
«Наше Радио»
но вот беда, кракозябры при отображении треков.

Не беда, открываем вот этот файл

sudo gedit /usr/share/pyshared/radiotray/StateMediator.py

Находим строчку

def notifySong(self, data):

После неё идёт строка

newMetadata = str(data)

Вот её надо заменить на вот такую строку

newMetadata = str(data).encode('latin-1').decode('cp1251').encode('utf8')

У меня получилось примерно вот так.

PS Обратим внимание, что код на Python и отступы в нём не ТАБ а пробелы, в данной строке 8 пробелов.
с табами может не работать ;)

mysq скопировать БД на другой сервер

Есть у меня очень большая БД, которую нельзя экспортировать через phpmyadmin сильно длительная операция все возможные таймауты вылетают.

тут понадобилось для теста развернуть эту БД на другом сервере. без промежуточного вывода в файл.

делаем это вот так

 mysqldump -uroot -pPASS bigDB | mysql -h 10.10.10.6 -uroot -pPASS bigDB

Вот так не хитро одной командой мы выводим дамп, и сразу же отправляем его во второй сервер.

Страница 4 из 32« Первая...23456102030...Последняя »