我正在使用 django 3.0,我试图在我的 ModelForm 中显示一个日期选择器小部件,但我不知道如何(我能得到的只是文本字段)。我尝试寻找一些解决方案,但找不到任何解决方案。这就是我的模型和 ModelForm 的样子:
class Membership(models.Model):
start_date = models.DateField(default=datetime.today, null=True)
owner = models.ForeignKey(Client, on_delete=models.CASCADE, null=True)
type = models.ForeignKey(MembershipType, on_delete=models.CASCADE, null=True)
class MembershipForm(ModelForm):
class Meta:
model = Membership
fields = ['owner', 'start_date', 'type']
widgets = {
'start_date': forms.DateInput
}
Run Code Online (Sandbox Code Playgroud)
这是我的 html:
<form class="container" action="" method="POST">
{% csrf_token %}
{{ form|crispy }}
<button type="submit" class="btn btn-primary">Submit</button>
</form>
Run Code Online (Sandbox Code Playgroud) 我的Django应用程序中有一个ModelForm,它使用forms.ModelMultipleChoiceField,它在窗体上显示为forms.CheckboxSelectMultiple小部件.此ModelForm用于选择/取消选择多对多关系的值.这是问题所在:当您取消选中所有复选框并保存表单时,它不会保存.如果取消选中除1之外的所有值,它会保存正确.
这里有关于模型形式和多对多关系的技巧吗?我遇到了一个bug吗?我是Django的新手.提前致谢.
自定义字段:
class NetworkMessageChoiceField(forms.ModelMultipleChoiceField):
def label_from_instance(self, obj):
return obj.display_message
Run Code Online (Sandbox Code Playgroud)
型号表格:
class MessageTemplateForm(forms.ModelForm):
network_messages = NetworkMessageChoiceField(queryset=NetworkMessageTemplate.objects,
widget=forms.CheckboxSelectMultiple())
class Meta:
model = UserProfile
fields = ('network_messages',)
Run Code Online (Sandbox Code Playgroud)
查看保存表单:
def save_message_templates(request, extra_context=dict()):
try:
profile_obj = request.user.get_profile()
except ObjectDoesNotExist:
profile_obj = UserProfile(user=request.user)
if request.method == 'POST':
form = MessageTemplateForm(request.POST, instance=profile_obj)
if form.is_valid():
form.save()
return redirect('/')
return index(request, message_template_form=form)
Run Code Online (Sandbox Code Playgroud)
编辑:
我的表单字段缺少必需= False.
class MessageTemplateForm(forms.ModelForm):
network_messages = NetworkMessageChoiceField(queryset=NetworkMessageTemplate.objects,
widget=forms.CheckboxSelectMultiple(),
required=False)
class Meta:
model = UserProfile
fields = ('network_messages',)
Run Code Online (Sandbox Code Playgroud) 令人印象深刻的是,功能性网站与教程中的通用视图一起快速发展.此外,表单处理的工作流程很好.我使用ModelForm帮助器类从我制作的模型创建一个表单,并很高兴看到这么多的功能汇集在一起.当我使用通用list_detail.object_detail时,我很失望,我可以显示的所有内容都是单独的字段.我知道ModelForm类包含用于呈现的信息,因此我想将ModelForm与通用视图一起使用.
我正在询问stackoverflow以获得一些方向,并欣赏几张海报的答案和评论.我已经想出如何让它工作,但DetailView中有一个错误.该解决方案包括一种解决方法.
要将ModelView与通用视图一起使用,并使所有字段自动呈现以下工作:
创建一个项目,并在其中创建应用程序住院患者.
如果你有
# inpatients/models.py
class Inpatient(models.Model):
last_name = models.CharField(max_length=30)
first_name = models.CharField(max_length=30,blank=True)
address = models.CharField(max_length=50,blank=True)
city = models.CharField(max_length=60,blank=True)
state = models.CharField(max_length=30,blank=True)
DOB = models.DateField(blank=True,null=True)
notes = models.TextField(blank=True)
def __unicode__(self):
return u'%s, %s %s' % (self.last_name, self.first_name, self.DOB)
class InpatientForm(ModelForm):
class Meta:
model = Inpatient
Run Code Online (Sandbox Code Playgroud)
和
# inpatients/views.py
from django.http import HttpResponse, HttpResponseRedirect
from django.shortcuts import render_to_response
from django.views.generic import DetailView
from portal.inpatients.models import *
def formtest(request):
if request.method == 'POST':
form = InpatientForm(request.POST)
if form.is_valid():
form.save()
return …Run Code Online (Sandbox Code Playgroud) 我的模型中有一个start_date和end_date字段,当它比start_date大时,我想给end_date分配一个错误,我一直在寻找文档,但是没有找到一个关于它的例子.
我一直在努力寻找这个,我无法在任何地方找到它.所以,在这里:
我正在尝试构建一个泛型类,它将通用模型作为参数并为其创建表单.为此,我使用Django的ModelForm和CreateView类.这个的主要目标是,当我需要创建一个新表单时,我只是声明一个传递Model名称的新URL.
url(r'^create', GenericCreate(model=Author).as_view(), name='create'),
Run Code Online (Sandbox Code Playgroud)
class GenericCreate(CreateView):
def __init__(self, model, *args, **kwargs):
super(GenericCreate, self).__init__(*args, **kwargs)
self.form_class = to_modelform(self.model)
Run Code Online (Sandbox Code Playgroud)
to_modelform是我实现的一个函数,它将模型转换为模型形式,并且它可以工作.
这给了我以下错误:
/ create中的AttributeError此方法仅在视图类上可用.
先感谢您!
我正在尝试使用当前用户所属的Django组填充ModelForm的Select列表。
没有错误出现,但是我只有一个空的选择列表。
这是我的代码:
class ArchiveForm(forms.ModelForm):
class Meta:
model = Archive
fields = ['tags', 'version', 'sharegp']
localized_fields = None
labels = {'tags': 'Related Keywords'}
sharegp = forms.ChoiceField(label='Share with groups')
def __init__(self, user, *args, **kwargs):
#import pudb;pudb.set_trace()
self.user = user
super(ArchiveForm, self).__init__(*args, **kwargs)
self.fields['sharegp'].queryset = Group.objects.filter(user=self.user)
self.fields['sharegp'].widget.choices = self.fields['sharegp'].choices
Run Code Online (Sandbox Code Playgroud)
请注意,如果我在方法的第一行中启用了调试器__init__,并沿函数前进,则该行:
self.fields['sharegp'].queryset
Run Code Online (Sandbox Code Playgroud)
提供正确的列表,其中包含该用户的组,但不会传递给实际表单。
我可能会缺少什么?谢谢!
我无法弄清楚如何控制模型表单的字段验证。
这是我的表格模型:
class UserForm(ModelForm):
class Meta:
model = User
fields = ('email', 'password')
Run Code Online (Sandbox Code Playgroud)
以下是我在模板中呈现表单的方式:
<form method="post" action="">
{% csrf_token %}
{{ userform.as_p }}
<input type="submit" value="Submit" />
</form>
Run Code Online (Sandbox Code Playgroud)
这是我的观点:
def login_page(request):
if request.method == 'POST':
userform = UserForm(request.POST)
if userform.is_valid():
email = request.POST['email']
password = request.POST['password']
user = authenticate(username=email, password=password)
if user is not None:
login(request, user)
return redirect('/dashboard/')
else:
# How can I give the user feedback about authentication failute here. Right now it just reloads the form without …Run Code Online (Sandbox Code Playgroud) 我正在编写具有以下模型的日历应用程序:
class CalendarHour(models.Model):
'''
Each day there are many events, e.g. at 10 am, the framer orders
material, etc.
'''
day_id = models.ForeignKey(CalendarDay)
time = models.TimeField()
work = models.TextField()
def __unicode__(self):
return 'work that took place at {work_time}'.format(work_time = self.time)
class CalendarDay(models.Model):
'''
Each project has so many daily logs. But, each daily log belongs to only one project (OneToMany relationship)
'''
company_id = models.ForeignKey(CompanyCalendar)
day_date = models.DateField(auto_now_add = True) # Recording the date each log is entered in
deadline …Run Code Online (Sandbox Code Playgroud) 我想让我的用户更改他们的个人资料图片。上传照片时,我被重定向到成功页面,但照片没有上传到文件夹,关联字段为空。请注意,如果用户已经有照片,它会将字段重置为空白,因此在提交表单后,用户不再有照片。
我的猜测是 form.save(commit=False) 没有上传照片,也没有更新字段,但我不明白为什么!
这是模型、视图和表单:
轮廓模型:
class Profil(models.Model):
user=models.OneToOneField(User, on_delete=models.CASCADE, primary_key=True)
photo_profil=models.ImageField(null=True,blank=True,upload_to='img/profils', verbose_name="Photo de profil", help_text="La taille du fichier doit être inférieure à {0}Mo. Seules les extensions .png, .jpeg et .jpg sont acceptées.".format(str(int(MAX_UPLOAD_SIZE/1000000))))
cours_valides=models.CharField(blank=True,max_length=255,validators=[int_list_validator])
niveau_valides=models.CharField(blank=True,max_length=255,validators=[int_list_validator])
def __str__(self):
return "Profil de {0}".format(self.user.username)
Run Code Online (Sandbox Code Playgroud)
模型形式:
class PhotoForm(forms.ModelForm):
class Meta:
model=models.Profil
fields=('photo_profil',)
def clean_photo(self):
photo=self.cleaned_data.get('photo_profil')
if photo.size>settings.MAX_UPLOAD_SIZE:
raise forms.ValidationError(_("Le fichier envoyé depasse la limite de %sMo.".format(str(settings.MAX_UPLOAD_SIZE/1000000))))
return photo
Run Code Online (Sandbox Code Playgroud)
和观点:
@login_required()
def change_photo(request):
if request.method=="POST":
form=forms.PhotoForm(request.POST,request.FILES)
if form.is_valid():
profil=form.save(commit=False)
profil.user=request.user
profil.save()
return redirect('espace_personnel')
else:
form=forms.PhotoForm() …Run Code Online (Sandbox Code Playgroud) 我知道 Django 2.0 中有一个新功能,它是 ModelAdmin 中的 AutocompleteSelect 小部件。我试图在我的自定义 modelForm 中使用它,但失败了。
像这样试过
#unit is the foreign key to the incident
class AccountForm(forms.ModelForm):
class Meta:
model = Invoice
...
...
widgets = { 'incident':widgets.AutocompleteSelect(Invoice._meta.get_field('incident').remote_field, admin.site)
}
...
Run Code Online (Sandbox Code Playgroud)
#Invoice model
class Invoice(models.Model):
...
incident = models.ForeignKey(Unit, on_delete=models.CASCADE,null=True)
...
Run Code Online (Sandbox Code Playgroud)
希望任何人都可以帮助我。谢谢
django ×10
modelform ×10
python ×6
django-forms ×3
validation ×2
checkbox ×1
datepicker ×1
django-admin ×1
generics ×1
many-to-many ×1
upload ×1