I have a django nested admin form and below code is my admin.py file content:
# -*- coding:utf-8 -*- from django.db.models import Q from django import forms from django.contrib.auth.admin import UserAdmin as AuthUserAdmin from django.contrib import admin from django.contrib.auth.forms import UserCreationForm, UserChangeForm from django.contrib.auth.hashers import UNUSABLE_PASSWORD_PREFIX, identify_hasher from django.forms.utils import flatatt from django.utils.html import format_html from django.utils.safestring import mark_safe from django.utils.translation import ugettext as _, ugettext from django.contrib.auth.models import Group, Permission from nested_admin.nested import NestedStackedInline, NestedModelAdmin from HomeMakers.apps.system.models import Dependant, Benefit, User, \ Unit, Stack, Parking from mtools.fields import UniqueValueWidget, PersianDateField class DependantAdminForm(forms.ModelForm): model = Dependant birth_date = PersianDateField(label=u'تاریخ تولد') class DependantAdmin(NestedStackedInline): model = Dependant form = DependantAdminForm extra = 0 exclude = ['changed_status', 'new_obj'] can_delete = True class BenefitSubAdmin(admin.TabularInline): model = Benefit extra = 1 min_num = 0 exclude = ['changed_status', 'new_obj'] can_delete = True class NewUserAdminForm(UserCreationForm): class Meta(UserCreationForm.Meta): model = User username = forms.RegexField(label=u"کد ملی", max_length=30, regex=r'^\d{8,10}$', widget=UniqueValueWidget, error_messages={'invalid': u"مقدار وارد شده قابل قبول نمیباشد."}) birth_date = PersianDateField(from_year=1290, to_year=1400, label=_('Birth Date')) start_date = PersianDateField(from_year=1290, to_year=1400, label=u"تاریخ شروع به کار") def clean_username(self): # Since User.username is unique, this check is redundant, # but it sets a nicer error message than the ORM. See #13147. username = self.cleaned_data["username"] if User.objects.filter(username=username).count() > 0: raise forms.ValidationError(self.error_messages['duplicate_username']) return username class ReadOnlyPasswordHashWidget(forms.Widget): def render(self, name, value, attrs): encoded = value final_attrs = self.build_attrs(attrs) if not encoded or encoded.startswith(UNUSABLE_PASSWORD_PREFIX): summary = mark_safe(u"<strong>%s</strong>" % _("No password set.")) else: try: hasher = identify_hasher(encoded) except ValueError: summary = mark_safe(u"<strong>%s</strong>" % _( "Invalid password format or unknown hashing algorithm.")) else: summary = u'''format_html_join('', "<strong>{0}</strong>: {1} ", ((ugettext(key), value) for key, value in hasher.safe_summary(encoded).items()) )''' return format_html(u"<div{0}>{1}</div>", flatatt(final_attrs), summary) class ReadOnlyPasswordHashField(forms.Field): widget = ReadOnlyPasswordHashWidget def __init__(self, *args, **kwargs): kwargs.setdefault("required", False) super(ReadOnlyPasswordHashField, self).__init__(*args, **kwargs) def bound_data(self, data, initial): # Always return initial because the widget doesn't # render an input field. return initial def _has_changed(self, initial, data): return False class EditUserAdminForm(UserChangeForm): class Meta(UserChangeForm.Meta): model = User birth_date = PersianDateField(from_year=1290, to_year=1400, label=_('Birth Date')) start_date = PersianDateField(from_year=1290, to_year=1400, label=u"تاریخ شروع به کار") password = ReadOnlyPasswordHashField(label=_("Password"), help_text=_("Raw passwords are not stored, so there is no way to see " "this user's password, but you can change the password " "using <a href=\"password/\">this form</a>.")) error_messages = {'duplicate_username': 'An user by this international code already exists.'} def __init__(self, *args, **kwargs): super(EditUserAdminForm, self).__init__(*args, **kwargs) self.fields['username'] = forms.RegexField(label=u"کد ملی", max_length=30, regex=r'^\d{8,10}$', widget=UniqueValueWidget(), error_messages={'invalid': u"مقدار وارد شده قابل قبول نمیباشد."}) self.fields['username'].widget.attrs['value'] = self.instance.username def clean_username(self): # Since User.username is unique, this check is redundant, # but it sets a nicer error message than the ORM. See #13147. username = self.cleaned_data["username"] if username != self.instance.username and User.objects.filter(username=username).count() > 0: raise forms.ValidationError(self.error_messages['duplicate_username']) return username class UnitForm(forms.ModelForm): model = Unit installment_begin_date = PersianDateField(label=u'تاریخ شروع اقساط') class StackSubAdmin(NestedStackedInline): model = Stack extra = 1 class ParkingSubAdmin(NestedStackedInline): model = Parking extra = 1 class UnitSubAdmin(NestedStackedInline): #(admin.StackedInline): model = Unit form = UnitForm extra = 0 inlines = [ParkingSubAdmin, StackSubAdmin] exclude = ['sum_of_pays', 'parkings', 'warehouse'] class UserAdmin(AuthUserAdmin, NestedModelAdmin): model = User ordering = ['last_name'] list_per_page = 10 add_form = NewUserAdminForm form = EditUserAdminForm list_display = ['user_thumb', 'first_name', 'last_name'] list_filter = ['units__project', 'groups'] formfield_overrides = { # models.DateField: {'widget': PersianDateWidget} } '''fields = ( 'username', 'password', 'first_name', 'last_name', 'email', 'gender', 'birth_date', 'picture', 'certificate_no', 'birth_place', 'address', 'home_phone', 'work_phone', 'mobile', 'personnel_code', 'international_code', 'job_field', 'self_employed_job_name', 'employment_type', 'start_date', 'is_retired' )''' inlines = [DependantAdmin, UnitSubAdmin] # & BenefitSubAdmin def get_fieldsets(self, request, obj=None): key_fields = {'fields': ('username', 'password1', 'password2')} if obj is not None: key_fields = {'fields': ('username', 'password')} fieldsets = ( (None, key_fields), (u'اطلاعات تکمیلی', {'fields': ( 'first_name', 'last_name', 'email', 'gender', 'birth_date', 'academic_degree', 'picture', 'international_card_scaned_file', 'certificate_scaned_file_page1', 'certificate_scaned_file_page2', 'academic_degree_scaned_file', 'job_edict_document', 'certificate_no', 'birth_place', 'address', 'home_phone', 'work_phone', 'mobile', 'personnel_code', 'job_field', 'self_employed_job_name', 'employment_type', 'start_date', 'is_retired' )} ), (u'سطوح دسترسی', {'fields': ('is_active', 'is_staff', 'groups')}) # , 'user_permissions', 'is_superuser')}), # (u'تاریخ های مهم', {'fields': ('last_login', 'date_joined')}) ) if request.user.is_superuser: fieldsets = ( (None, key_fields), (u'اطلاعات تکمیلی', {'fields': ( 'first_name', 'last_name', 'email', 'gender', 'birth_date', 'academic_degree', 'picture', 'international_card_scaned_file', 'certificate_scaned_file_page1', 'certificate_scaned_file_page2', 'academic_degree_scaned_file', 'job_edict_document', 'certificate_no', 'birth_place', 'address', 'home_phone', 'work_phone', 'mobile', 'personnel_code', 'job_field', 'self_employed_job_name', 'employment_type', 'start_date', 'is_retired' )} ), (u'سطوح دسترسی', {'fields': ( 'is_active', 'is_staff', 'is_superuser', 'user_permissions', 'groups' ) }) # (u'تاریخ های مهم', {'fields': ('last_login', 'date_joined')}) ) return fieldsets def get_queryset(self, request): if request.user.is_superuser: return User.objects.all() return User.objects.filter(is_superuser=False) class GroupAdmin(admin.ModelAdmin): model = Group filter_horizontal = ('permissions',) def formfield_for_manytomany(self, db_field, request, **kwargs): if db_field.name == "permissions" and not request.user.is_superuser: kwargs["queryset"] = Permission.objects.exclude( Q(codename__startswith='add_') | Q(codename__startswith='change_') | Q(codename__startswith='delete_') ) return super(GroupAdmin, self).formfield_for_manytomany( db_field, request, **kwargs ) def save_model(self, request, group, form, change): perms = [] for p in group.permissions.all(): if p.codename.startswith('add_') or \ p.codename.startswith('change_') or \ p.codename.startswith('delete_'): perms.append(p) super(GroupAdmin, self).save_model(request, group, form, change) form.cleaned_data['permissions'] = list( form.cleaned_data['permissions'] ) if not request.user.is_superuser: form.cleaned_data['permissions'].extend(perms) form.cleaned_data['permissions'] = list(set( form.cleaned_data['permissions'])) group.save() # register new user admin admin.site.unregister(User) admin.site.register(User, UserAdmin) admin.site.unregister(Group) admin.site.register(Group, GroupAdmin)
When i developing and run devserver on localhost anything work nice, but on the server and by domain i can't submit this form by The connection was reset message. Below code is my apache2 configs:
<VirtualHost *:80> DocumentRoot "/var/www/wordpress" # ServerName localhost # Alias /wordpress /var/www/wordpress # <Directory /var/www/wordpress> # Options Indexes FollowSymLinks # AllowOverride None # Order Deny,Allow # Allow from all # </Directory> WSGIScriptAlias /m3s /var/www/m3s/HomeMakers/wsgi.py #ProxyPass /m3s/ http://127.0.0.1:8000/ #ProxyPassReverse /m3s/ http://127.0.0.1:8000/ #<Proxy http://127.0.0.1:8000/m3s/> # Order Allow,Deny # Allow from all #</Proxy> # WSGIDaemonProcess sentry python-path=/var/www/sentry/venv/lib/python2.7/site-packages # WSGIScriptAlias /exceptions/tracker /var/www/sentry/venv/lib/python2.7/site-packages/sentry/wsgi.py Alias /ufiles /var/www/m3s/media_files Alias /static /var/www/m3s/sfiles Alias /_static /var/www/sentry/venv/lib/python2.7/site-packages/sentry/static Alias /mydb/admin /usr/share/phpmyadmin <Directory "/var/www/m3s/HomeMakers/"> Options +ExecCGI Order allow,deny Allow from all Require all granted </Directory> <Directory /var/www/m3s/sfiles/> Order allow,deny Allow from all </Directory> ErrorLog ${APACHE_LOG_DIR}/error.log CustomLog ${APACHE_LOG_DIR}/access.log combined </VirtualHost>
Also i tried to using uwsgi and mod_proxy together but my problem not resolved. After i monitor access.log and my server port 80 by tshark, tshard shows me this request but in access.log file i can't see any change...
Apache logs in info mode:
[Sun Jan 29 21:15:47.896062 2017] [wsgi:warn] [pid 7596] mod_wsgi: Compiled for Python/2.7.11. [Sun Jan 29 21:15:47.896100 2017] [wsgi:warn] [pid 7596] mod_wsgi: Runtime using Python/2.7.11+. [Sun Jan 29 21:15:47.898887 2017] [mpm_prefork:notice] [pid 7596] AH00163: Apache/2.4.18 (Ubuntu) mod_wsgi/4.3.0 Python/2.7.11+ configured -- resuming normal operations [Sun Jan 29 21:15:47.898913 2017] [core:notice] [pid 7596] AH00094: Command line: '/usr/sbin/apache2' [Sun Jan 29 21:16:43.833245 2017] [wsgi:info] [pid 7599] [client 84.241.62.118:44316] mod_wsgi (pid=7599, process='', application='ut3taavoni.ir|/m3s'): Loading WSGI script '/var/www/m3s/HomeMakers/wsgi.py'. [Sun Jan 29 21:16:45.317557 2017] [wsgi:error] [pid 7599] DEBUG 2017-01-29 21:16:45,317 base 7599 -1220638144 Configuring Raven for host: <raven.conf.remote.RemoteConfig object at 0xada5a12c> [Sun Jan 29 21:16:47.484799 2017] [wsgi:info] [pid 7602] [client 84.241.62.118:42751] mod_wsgi (pid=7602, process='', application='ut3taavoni.ir|/m3s'): Loading WSGI script '/var/www/m3s/HomeMakers/wsgi.py'., referer: http://ut3taavoni.ir/m3s/m3s-panel/members/user/501/?_changelist_filters=q%3D0065231619 [Sun Jan 29 21:16:48.899865 2017] [wsgi:error] [pid 7602] DEBUG 2017-01-29 21:16:48,899 base 7602 -1220638144 Configuring Raven for host: <raven.conf.remote.RemoteConfig object at 0xada5a12c> [Sun Jan 29 21:17:33.961983 2017] [wsgi:info] [pid 7603] [client 84.241.62.118:20515] mod_wsgi (pid=7603, process='', application='ut3taavoni.ir|/m3s'): Loading WSGI script '/var/www/m3s/HomeMakers/wsgi.py'., referer: http://ut3taavoni.ir/m3s/m3s-panel/members/user/501/?_changelist_filters=q%3D0065231619 [Sun Jan 29 21:17:35.360116 2017] [wsgi:error] [pid 7603] DEBUG 2017-01-29 21:17:35,360 base 7603 -1220638144 Configuring Raven for host: <raven.conf.remote.RemoteConfig object at 0xada5a1ac>
And my access.log file content:
192.0.102.40 - - [29/Jan/2017:22:37:30 +0330] "HEAD / HTTP/1.1" 200 372 "-" "jetmon/1.0 (Jetpack Site Uptime Monitor by WordPress.com)" xxx.241.62.118 - - [29/Jan/2017:22:37:56 +0330] "GET /m3s/m3s-panel/members/user/ HTTP/1.1" 200 4627 "-" "Mozilla/5.0 (X11; Linux x86_64; rv:50.0) Gecko/20100101 Firefox/50.0" xxx.241.62.118 - - [29/Jan/2017:22:37:57 +0330] "GET /m3s/m3s-panel/jsi18n/ HTTP/1.1" 200 10588 "http://ut3taavoni.ir/m3s/m3s-panel/members/user/" "Mozilla/5.0 (X11; Linux x86_64; rv:50.0) Gecko/20100101 Firefox/50.0" xxx.241.62.118 - - [29/Jan/2017:22:38:51 +0330] "GET /m3s/m3s-panel/members/user/?q=0065231619 HTTP/1.1" 200 4195 "http://ut3taavoni.ir/m3s/m3s-panel/members/user/" "Mozilla/5.0 (X11; Linux x86_64; rv:50.0) Gecko/20100101 Firefox/50.0" xxx.241.62.118 - - [29/Jan/2017:22:38:51 +0330] "GET /m3s/m3s-panel/jsi18n/ HTTP/1.1" 200 10588 "http://ut3taavoni.ir/m3s/m3s-panel/members/user/?q=0065231619" "Mozilla/5.0 (X11; Linux x86_64; rv:50.0) Gecko/20100101 Firefox/50.0" xxx.241.62.118 - - [29/Jan/2017:22:38:54 +0330] "GET /m3s/m3s-panel/members/user/501/?_changelist_filters=q%3D0065231619 HTTP/1.1" 200 14967 "http://ut3taavoni.ir/m3s/m3s-panel/members/user/?q=0065231619" "Mozilla/5.0 (X11; Linux x86_64; rv:50.0) Gecko/20100101 Firefox/50.0" xxx.241.62.118 - - [29/Jan/2017:22:38:55 +0330] "GET /m3s/m3s-panel/jsi18n/ HTTP/1.1" 200 10588 "http://ut3taavoni.ir/m3s/m3s-panel/members/user/501/?_changelist_filters=q%3D0065231619" "Mozilla/5.0 (X11; Linux x86_64; rv:50.0) Gecko/20100101 Firefox/50.0" xxx.241.62.118 - - [29/Jan/2017:22:38:55 +0330] "GET /m3s/_nested_admin/server-data.js HTTP/1.1" 200 388 "http://ut3taavoni.ir/m3s/m3s-panel/members/user/501/?_changelist_filters=q%3D0065231619" "Mozilla/5.0 (X11; Linux x86_64; rv:50.0) Gecko/20100101 Firefox/50.0"
My related question on ServerFault site: http://serverfault.com/questions/827813/apache-respons-to-get-but-not-to-post
Update:
I ran tshark again and saw below important line:
7 0.754812317 5.113.18.90 -> xxx.156.28.145 HTTP 1434 POST /m3s/m3s-panel/members/user/501/ HTTP/1.1 [Malformed Packet]
Below is my browser "Request Payload":
Content-Type: multipart/form-data; boundary=---------------------------51995842320268179811054389612 Content-Length: 4614 -----------------------------51995842320268179811054389612 Content-Disposition: form-data; name="csrfmiddlewaretoken" STMAQ1bSTuWsl9CelQBK5S2QjUKIfZ1Z -----------------------------51995842320268179811054389612 Content-Disposition: form-data; name="username" 9265291619 -----------------------------51995842320268179811054389612 Content-Disposition: form-data; name="first_name" اعظم -----------------------------51995842320268179811054389612 Content-Disposition: form-data; name="last_name" جعفری -----------------------------51995842320268179811054389612 Content-Disposition: form-data; name="email" jafariphd@ut.ac.ir -----------------------------51995842320268179811054389612 Content-Disposition: form-data; name="gender" 0 -----------------------------51995842320268179811054389612 Content-Disposition: form-data; name="birth_date_0" 15 -----------------------------51995842320268179811054389612 Content-Disposition: form-data; name="birth_date_1" 6 -----------------------------51995842320268179811054389612 Content-Disposition: form-data; name="birth_date_2" 1356 -----------------------------51995842320268179811054389612 Content-Disposition: form-data; name="academic_degree" 5 -----------------------------51995842320268179811054389612 Content-Disposition: form-data; name="picture"; filename="" Content-Type: application/octet-stream -----------------------------51995842320268179811054389612 Content-Disposition: form-data; name="international_card_scaned_file"; filename="" Content-Type: application/octet-stream -----------------------------51995842320268179811054389612 Content-Disposition: form-data; name="certificate_scaned_file_page1"; filename="" Content-Type: application/octet-stream -----------------------------51995842320268179811054389612 Content-Disposition: form-data; name="certificate_scaned_file_page2"; filename="" Content-Type: application/octet-stream -----------------------------51995842320268179811054389612 Content-Disposition: form-data; name="academic_degree_scaned_file"; filename="" Content-Type: application/octet-stream -----------------------------51995842320268179811054389612 Content-Disposition: form-data; name="job_edict_document"; filename="" Content-Type: application/octet-stream -----------------------------51995842320268179811054389612 Content-Disposition: form-data; name="certificate_no" 11909 -----------------------------51995842320268179811054389612 Content-Disposition: form-data; name="birth_place" تهران -----------------------------51995842320268179811054389612 Content-Disposition: form-data; name="address" تهران -میدان پاستور-خ پاستور غربی-خ آژیده-کوچه آفین-پ 7-طبقه اول غربی -----------------------------51995842320268179811054389612 Content-Disposition: form-data; name="home_phone" 66915902 -----------------------------51995842320268179811054389612 Content-Disposition: form-data; name="work_phone" 66409696 -----------------------------51995842320268179811054389612 Content-Disposition: form-data; name="mobile" 09125114282 -----------------------------51995842320268179811054389612 Content-Disposition: form-data; name="personnel_code" 26687 -----------------------------51995842320268179811054389612 Content-Disposition: form-data; name="job_field" 1 -----------------------------51995842320268179811054389612 Content-Disposition: form-data; name="self_employed_job_name" کارشناس معماری -----------------------------51995842320268179811054389612 Content-Disposition: form-data; name="employment_type" 3 -----------------------------51995842320268179811054389612 Content-Disposition: form-data; name="start_date_0" 1 -----------------------------51995842320268179811054389612 Content-Disposition: form-data; name="start_date_1" 1 -----------------------------51995842320268179811054389612 Content-Disposition: form-data; name="start_date_2" 1385 -----------------------------51995842320268179811054389612 Content-Disposition: form-data; name="is_active" on -----------------------------51995842320268179811054389612 Content-Disposition: form-data; name="is_staff" on -----------------------------51995842320268179811054389612 Content-Disposition: form-data; name="groups" 3 -----------------------------51995842320268179811054389612 Content-Disposition: form-data; name="_continue" ذخیره و ادامهٔ ویرایش -----------------------------51995842320268179811054389612--
But now my questions is how this problem happend and how can i resolve this?