这是我的模特:
class Post(models.Model):
owner = models.ForeignKey(User, related_name="%(app_label)s%(class)s_set")
post = models.CharField(max_length=400)
class Meta:
abstract = True
class DS(Post):
location = models.ForeignKey(Location, blank=True, null=True, related_name="%(app_label)s%(class)s_set")
class Meta(Post.Meta):
abstract = True
class S(DS):
# same as DS
pass
Run Code Online (Sandbox Code Playgroud)
现在,当我打开Python shell并执行此操作时:
a = User.objects.get(username='a')
dir(a)
Run Code Online (Sandbox Code Playgroud)
然后这两个出现:
['myapps_set', 's_set']
Run Code Online (Sandbox Code Playgroud)
当我这样做时:
a.s_set.all()
Run Code Online (Sandbox Code Playgroud)
它返回一个S对象,但是当我这样做时:
a.myapps_set.all()
Run Code Online (Sandbox Code Playgroud)
它返回三个S对象(它返回的第一个S对象与我返回的对象相同a.s_set.all().我的两个问题是,
1)为什么即使我特意做了owner = models.ForeignKey(User, related_name="%(app_label)s%(class)s_set"),s_set也可以用用户对象访问?
2)为什么他们会返回两组不同的对象(即如何myapps_set.all()返回3(正确的答案)而s_set.all()只返回一个?
我使用的是VMplayer,我的操作系统是Lubuntu 14.04.它附带一个预装的python3.4.0,但我想安装python3.4.3.我从这里下载了.tar.xz文件.
然后我提取文件并按照自述文件中的说明操作:
./configure
make
make test
Run Code Online (Sandbox Code Playgroud)
我最初跑的时候
make test
Run Code Online (Sandbox Code Playgroud)
它说"3次测试失败,3次改变执行环境,25次跳过".我在这里发布了问题: 安装Python3.4.3:3次测试失败,3次更改执行环境,25次跳过
然后我做了
sudo apt-get install libssl-dev
Run Code Online (Sandbox Code Playgroud)
并做到了
./configure
make
Run Code Online (Sandbox Code Playgroud)
又说了一遍:
Python build finished successfully!
The necessary bits to build these optional modules were not found:
_bz2 _curses _curses_panel
_dbm _gdbm _lzma
_sqlite3 _tkinter readline
To find the necessary bits, look in setup.py in detect_modules() for the module's name.
Run Code Online (Sandbox Code Playgroud)
现在,当我尝试
make test
Run Code Online (Sandbox Code Playgroud)
它说
1 test failed:
test_ssl
2 tests altered the execution environment:
test___all__ test_warnings
21 tests skipped: …Run Code Online (Sandbox Code Playgroud) 这是我的serializers.py(我想为内置的User模型创建一个序列化器):
from rest_framework import serializers
from django.contrib.auth.models import User
class UserSerializer(serializers.ModelSerializer):
class Meta:
model = User
fields = ('username', 'password', 'email', )
Run Code Online (Sandbox Code Playgroud)
我知道Django Rest Framework有它自己的字段验证器,因为当我尝试使用已经存在的用户名创建用户时,它会引发一个错误:
{'username': [u'This field must be unique.']}
Run Code Online (Sandbox Code Playgroud)
我想自定义错误消息并让它说"此用户名已被占用.请再试一次"而不是说"此字段必须是唯一的".
它还有一个内置的正则表达式验证器,因为当我创建带有感叹号的用户名时,它会说:
{'username': [u'Enter a valid username. This value may contain only letters, numbers and @/./+/-/_ characters.']}
Run Code Online (Sandbox Code Playgroud)
我想自定义正则表达式验证器,以便它只是说"无效的用户名".
如何自定义每个字段的所有错误消息?
注意:根据这篇文章:Django Rest Framework序列化程序中的自定义错误消息我可以这样做:
class UserSerializer(serializers.ModelSerializer):
class Meta:
model = User
def __init__(self, *args, **kwargs):
super(UserSerializer, self).__init__(*args, **kwargs)
self.fields['username'].error_messages['required'] = u'My custom required msg'
Run Code Online (Sandbox Code Playgroud)
但是我如何为"独特"和"正则表达式"验证器做些什么呢?我试过了
self.fields['username'].error_messages['regex'] = u'My custom …Run Code Online (Sandbox Code Playgroud) django validation error-handling django-serializer django-rest-framework
这是我的模特:
class Post(models.Model):
user = models.ForeignKey(User)
post = models.CharField(max_length=400)
country = models.ForeignKey(Country, blank=True, null=True)
Run Code Online (Sandbox Code Playgroud)
这是我的序列化器:
class PostSerializer(serializers.ModelSerializer):
class Meta:
model = Post
fields = ('user', 'post', 'country',)
def create(self, validated_data):
post = Post(
user = User.objects.get(username='MyUser'),
post = validated_data['post'],
)
if validated_data.get('country', None):
post.country = validated_data['country']
return post
Run Code Online (Sandbox Code Playgroud)
有没有办法让我告诉DRF,如果该字段的值为null(因为'country'字段是可选的,有时不提供),那么跳过它并只序列化其他数据?或者至少将其序列化为None值?
我不认为我可以使用SerializerMethodField(http://www.django-rest-framework.org/api-guide/fields/#serializermethodfield)因为'country'字段不是只读字段(我也写过)它也是,如果提供的话).
我基本上想要在序列化对象时省略该字段(或至少使值为None)如果该字段为null.
这是我的看法:
def main_page(request):
if request.method == 'POST':
form = RegistrationForm(request.POST)
if form.is_valid():
user = User.objects.create_user(
username=form.clean_data['username'],
password=form.clean_data['password1'],
email=form.clean_data['email']
)
return HttpResponseRedirect('/')
else:
form = RegistrationForm()
variables = {
'form': form
}
return render(request, 'main_page.html', variables)
Run Code Online (Sandbox Code Playgroud)
这是我的main_page.html:
{% if form.errors %}
<p>NOT VALID</p>
{% for errors in form.errors %}
{{ errors }}
{% endfor %}
{% endif %}
<form method="post" action="/">{% csrf_token %}
<p><label for="id_username">Username:</label>{{ form.username }}</p>
<p><label for="id_email">Email Address:</label>{{ form.email }}</p>
<p><label for="id_password">Password:</label>{{ form.password1 }}</p>
<p><label for="id_retypePassword">Retype Password:</label>{{ form.password2 }}</p> …Run Code Online (Sandbox Code Playgroud) forms django django-views django-authentication django-registration
这是我的models.py:
def get_profileImage_file_path(instance, filename):
return os.path.join('%s/uploadedPhotos/profileImages' % instance.user_id, filename)
class UserExtended(models.Model):
user = models.OneToOneField(User)
profileImage = models.ImageField(upload_to=get_profileImage_file_path, default='/static/images/myProfileIcon.png')
Run Code Online (Sandbox Code Playgroud)
现在,我希望默认图像(在我的静态文件夹中)保存到给定的路径中
get_profileImage_file_path
Run Code Online (Sandbox Code Playgroud)
功能.在我的settings.py中,我将media_root和media_URL定义为:
MEDIA_ROOT = '/home/username/Documents/aSa/userPhotos'
MEDIA_URL = '/media/'
Run Code Online (Sandbox Code Playgroud)
出于某种原因,当我在模板和模板中传递用户对象时,如果我这样做:
<img class='profilePic' src="{{ user.userextended.profileImage.url }}" height='120px' alt="" />
Run Code Online (Sandbox Code Playgroud)
没有图像显示,当我打开chrome中的'inspect element'部分时,它会出现404错误:
GET http://127.0.0.1:8000/home/username/Documents/djcode/aS/aSa/static/images/myProfileIcon.png 404 (NOT FOUND)
Run Code Online (Sandbox Code Playgroud)
即使这是图像的正确文件路径.(我也不确定它为什么要提供整个文件路径,是不是它应该从/ static /开始?即使我'查看源',整个网址都在那里.)我怎样才能这样做位于静态文件夹中的默认图像上传到中提供的路径
get_profileImage_file_path
Run Code Online (Sandbox Code Playgroud)
功能?
我正在使用默认的 User 模型,并且还使用 UserExtended 模型对其进行了扩展:
class Country(models.Model):
countryName = models.CharField(max_length=50, unique=True)
countryCode = models.CharField(max_length=10, unique=True)
class UserExtended(models.Model):
user = models.OneToOneField(User, related_name="userextended")
country = models.ForeignKey(Country)
Run Code Online (Sandbox Code Playgroud)
我正在尝试遵循此处记录的内容:http : //www.django-rest-framework.org/api-guide/relations/#reverse-relations
这是我的 UserSerializer:
class UserSerializer(serializers.ModelSerializer):
def __init__(self, *args, **kwargs):
super(UserSerializer, self).__init__(*args, **kwargs) # call the super()
for field in self.fields: # iterate over the serializer fields
self.fields[field].error_messages['required'] = 'Enter a valid %s.'%field # set the custom error message
class Meta:
model = User
fields = ('username', 'password', 'email', 'userextended')
extra_kwargs = {
'password': …Run Code Online (Sandbox Code Playgroud) django django-models django-serializer django-rest-framework
这是我的ViewSet:
class PostViewSet(viewsets.ModelViewSet):
serializer_class = PostSerializer
permission_classes = (IsAuthenticated, IsOwnerDeleteOrReadOnly)
def get_queryset(self):
return Post.objects.filter(location=self.request.user.userextended.location)
def perform_create(self, serializer):
serializer.save(owner=self.request.user, location=self.request.user.userextended.location)
def get_serializer_context(self):
"""
Extra context provided to the serializer class.
"""
return {
'format': self.format_kwarg,
'view': self,
'location': self.request.user.userextended.location
}
@detail_route(methods=['post'], permission_classes=[IsAuthenticated, IsFromLocation])
def like(self, request, pk=None):
post = self.get_object()
post.usersVoted.add(request.user)
return Response(status=status.HTTP_204_NO_CONTENT)
@detail_route(methods=['get'], permission_classes=[IsAuthenticated, ValidPostPkInKwargs, IsFromPostLocation])
def replies(self, request, pk=None):
post = self.get_object()
replies = post.postreply_set.all()
serializer = PostReplySerializer(replies, many=True)
return Response(serializer.data)
Run Code Online (Sandbox Code Playgroud)
这是我的PostReplySerializer:
class PostReplySerializer(serializers.ModelSerializer):
owner = serializers.SlugRelatedField(slug_field='username', read_only=True)
voted …Run Code Online (Sandbox Code Playgroud) 所以我有自己的看法:
def home_page(request):
form = UsersForm()
if request.method == "POST":
form = UsersForm(request.POST)
if form.is_valid():
form.save()
c = {}
c.update(csrf(request))
c.update({'form':form})
return render_to_response('home_page.html', c)
Run Code Online (Sandbox Code Playgroud)
我的forms.py:
class UsersForm(forms.ModelForm):
class Meta:
model = Users
widgets = {'password':forms.PasswordInput()}
def __init__(self, *args, **kwargs):
super( UsersForm, self ).__init__(*args, **kwargs)
self.fields[ 'first_name' ].widget.attrs[ 'placeholder' ]="First Name"
self.fields[ 'last_name' ].widget.attrs[ 'placeholder' ]="Last Name"
self.fields[ 'password' ].widget.attrs[ 'placeholder' ]="Password"
Run Code Online (Sandbox Code Playgroud)
和我的模板:
<html>
<body>
<form method="post" action="">{% csrf_token %}
{{ form.first_name }} {{form.last_name }} <br>
{{ form.password }} <br>
<input …Run Code Online (Sandbox Code Playgroud) django django-templates django-models django-forms django-errors
这是我的html:
<div class='parentDiv'>
<div class='childDiv'></div>
</div>
Run Code Online (Sandbox Code Playgroud)
这是我的CSS:
.parentDiv {
margin-top: 200px;
width: 700px;
height: 800px;
background-color: red;
}
.childDiv {
background-color: green;
width: 50px;
height: 50px;
margin-top: 22px;
}
Run Code Online (Sandbox Code Playgroud)
小提琴:http://jsfiddle.net/1whywvpa/
childDiv为何无法获得22px的页边空白?如果像素大于已经提供给parentDiv的200像素,则它只会获得页边空白。有什么办法可以使childDiv相对于parentDiv获得22px的父级div,而无需进行某种类型的“给父div一个1px的填充”黑客?
django ×8
python ×2
css ×1
django-forms ×1
django-views ×1
forms ×1
html ×1
inheritance ×1
installation ×1
margin ×1
python-3.4 ×1
ubuntu-14.04 ×1
validation ×1