标签: modelform

模型表单集和日期字段

我在一个带有几个日期字段的模型上有一个模型formset - 它也是模型中的DateTimeField.但是当它显示在模板中时,它显示为文本字段.如何将其显示为下拉框?

WFormSet = inlineformset_factory(UserProfile, W, can_delete=False,exclude=[<list of fields to be excluded>], extra=3) 
Run Code Online (Sandbox Code Playgroud)

这就是我初始化modelformset的方式.

如何覆盖这些设置

django datetime templates modelform

3
推荐指数
1
解决办法
2163
查看次数

无法在__init__处向ModelForm添加字段

我有ModelForm的问题.显示字段"test1",但"test2" - 不显示.使用base_fields没有帮助.

# models.py
class Country(models.Model):
    name = CharField(max_length=100)

# admin.py
class CountryAdminForm(ModelForm):
    test1 = forms.CharField('test1')

    def __init__(self, *args, **kwargs):
        super(CountryAdminForm, self).__init__(*args, **kwargs)
        self.fields['test2'] = forms.CharField('test2')

    class Meta:
        model = Country

class CountryAdmin(admin.ModelAdmin):
    form = CountryAdminForm

admin.site.register(Country, CountryAdmin)

Run Code Online (Sandbox Code Playgroud)

谢谢.

python django modelform

3
推荐指数
1
解决办法
3486
查看次数

混淆了ModelForm()的孩子的save()中的self.instance

保存()文档中解释说:

ModelForm的子类可以接受现有的模型实例作为关键字参数实例; 如果提供了这个,save()将更新该实例.如果未提供,save()将创建指定模型的新实例

然而,self.instancesave()总是有一个对象.

那么,我如何判断它instance是现有的还是新创建的?

django instance save modelform

3
推荐指数
1
解决办法
1681
查看次数

用于图像域的模型形式的Django自定义验证(最大文件大小等)

我有一个模型,有一个名为'banner'的图像字段,我试图验证文件大小和尺寸,如果图像太大,则提供错误.

这是models.py:

class Server(models.Model):
    id = models.AutoField("ID", primary_key=True, editable=False)
    servername = models.CharField("Server Name", max_length=20)
    ip = models.CharField("IP Address", max_length=50)
    port = models.CharField("Port", max_length=5, default='25565')
    banner = models.ImageField("Banner", upload_to='banners', max_length=100)
    description = models.TextField("Description", blank=True, max_length=3000)
    rank = models.IntegerField(default=0)
    votes = models.IntegerField(default=0)
    website = models.URLField("Website URL", max_length=200, blank=True)
    user = models.ForeignKey(User)
    motd = models.CharField("MOTD", max_length=150, default='n/a')
    playersonline = models.CharField("Online Players", max_length=7, default='n/a')
    online = models.BooleanField("Online", default=False)
    sponsored = models.BooleanField("Sponsored", default=False)
    lastquery = models.DateTimeField('Last Queried', auto_now=True)
    slugurl = models.SlugField("SlugURL", max_length=50)
    def __unicode__(self):
        return …
Run Code Online (Sandbox Code Playgroud)

python django validation modelform imagefield

3
推荐指数
1
解决办法
5463
查看次数

django泛型CreateView和UpdateView中的Modelformset

我有一个模型组织,有两个字段'id'和'name'.我打算用动态模型formsets填充它.我到目前为止的代码如下.

形式

class OrganizationForm(forms.ModelForm):
    class Meta:
        model = Organization
        fields = ('name',)

OrganizationFormset = modelformset_factory(Organization, form=OrganizationForm, fields=('name', ), extra=1)
Run Code Online (Sandbox Code Playgroud)

意见

class OrganizationCreate(CreateView):
    model = Organization
    form_class = OrganizationForm

    def get_context_data(self, **kwargs):
        context = super(OrganizationCreate, self).get_context_data(**kwargs)
        context['formset'] = OrganizationFormset()
        return context

    def post(self, request, *args, **kwargs):
        formset = OrganizationFormset(request.POST)
        if formset.is_valid():
            return self.form_valid(formset)

    def form_valid(self, formset):
        formset.save()
        return HttpResponseRedirect('/')

    def form_invalid(self, formset):
        return self.render_to_response(self.get_context_data(formset=formset))


class OrganizationUpdate(UpdateView):
    model = Organization
    form_class = OrganizationForm
    template_name_suffix = '_update_form'

    def get_context_data(self, **kwargs):
        context = super(OrganizationUpdate, …
Run Code Online (Sandbox Code Playgroud)

python django modelform formset

3
推荐指数
1
解决办法
2451
查看次数

使用包含RadioSelect小部件的ModelChoiceField在ModelForm中的queryset中获取request.user

我想向社区询问以下有关传递request.userquerysetin的信息ModelForm。我的ModelForm是:

class goForm(ModelForm): 
    user_choice = goModelChoiceField(
            widget=forms.RadioSelect,
            queryset=Document.objects.all().filter(who_upload=request.user),
            empty_label=None,
            to_field_name='docfile',
            label = 'Please select'
            )            
    class Meta:
        model = go
        fields = ['user_choice']
Run Code Online (Sandbox Code Playgroud)

class goModelChoiceField(forms.ModelChoiceField):
        def label_from_instance(self, obj):
            return  "'%s' uploaded on %s" % (obj.file_name, 
                obj.when_upload.date()) 
Run Code Online (Sandbox Code Playgroud)

所有我已经找到答案指代传递request.user__init__或填充goForm与筛选的选择的视图。但是,在我的情况下,似乎没有任何效果,因为我将表单子类化为返回特定的字符串,并且我正在使用RadioSelect特别需要使用querysetas作为参数的小部件(对此我不是100%肯定)。那么,如何可以通过request.useruser_choice

django django-forms modelform django-queryset django-views

3
推荐指数
1
解决办法
1551
查看次数

具有模拟数据的ModelChoiceField的UnitTest ModelForm

我一直在尝试为我的ModelForm编写单元测试,它有一个ModelChoiceField.我正在使用模拟数据创建Form实例.

这是我的模特:

# models.py
class Menu(models.Model):
    dish = models.ForeignKey(Dish, default=None)
    price = models.DecimalField(max_digits=7, decimal_places=2)

# forms.py
class MenuForm(forms.ModelForm):
    class Meta:
        model = Menu
        fields = ('dish', 'price',)

    def clean(self):
        cleaned_data = super(MenuForm, self).clean()
        price = cleaned_data.get('price', None)
        dish = cleaned_data.get('dish', None)

        # Some validation below
        if price < 70:
            self.add_error('price', 'Min price threshold')
            return cleaned_data
Run Code Online (Sandbox Code Playgroud)

这是我的测试用例:

class MenuFormTest(TestCase):
    def test_price_threshold(self):
        mock_dish = mock.Mock(spec=Dish)
        form_data = {
            'dish': mock_dish,
            'price': 80,
        }
        form = forms.MenuForm(data=form_data)
        self.assertTrue(form.is_valid())
Run Code Online (Sandbox Code Playgroud)

此操作失败,并显示以下错误:

<ul class="errorlist"><li>dish<ul class="errorlist"><li>Select a …
Run Code Online (Sandbox Code Playgroud)

python django unit-testing modelform

3
推荐指数
1
解决办法
713
查看次数

Django Model Formset:仅跟踪对集合中已更新/保存的项目的更改?

因此,我正在使用Django的Model Formset生成用于不同数据的表单集。效果很好,但是我想添加一个功能,当用户显示表单集并更新10个项目中的2个时,我只能跟踪更新的2个项目,并输出类似“您已更新2个项目”的消息“ 之类的事情。

Django Model Formsets是否为此具有内置API?我似乎在Django Docs上找不到它。

我尝试了各种方法,但是在使用下面的Peter提供的代码时仍然会遇到这种情况:

'Attendance' object has no attribute 'has_changed.' 
Run Code Online (Sandbox Code Playgroud)

如果我将form.has_changed切换为formset.has_changed(),我会得到

'list' object has no attribute 'has_changed'
Run Code Online (Sandbox Code Playgroud)

我的查看和发布方法

class AttendanceView(TemplateView):

    template_name = 'example.html'

    def changed_forms(self, formset):
        return sum(1 for form in formset if form.has_changed())

def post(self, request, *args, **kwargs):
    formset = AttendanceFormSet(request.POST)
    if formset.is_valid():
        formset = formset.save()
        forms_changed = self.changed_forms(formset)
        context = self.get_context_data(**kwargs)
        context['total_changed_forms'] = forms_changed
        return self.render_to_response(context)
    else:
        return HttpResponse("POST failed")
Run Code Online (Sandbox Code Playgroud)

所以我想通了,只需更改:

formset = formset.save() 
Run Code Online (Sandbox Code Playgroud)

formset.save()
Run Code Online (Sandbox Code Playgroud)

python django django-forms modelform django-views

3
推荐指数
1
解决办法
1471
查看次数

Django在反向重定向中使用新创建的对象

我试图从新创建的项目对象中提取id,以便我可以将用户重定向到包含新项目的页面.现在我得到''ProjectAddForm'对象没有属性'id'".

我在网上看到这应该有用,但出于某种原因,它不是.

if request.method == 'POST':
        form = ProjectAddForm(request.POST)
        if form.is_valid():
            form.save()
            return HttpResponseRedirect(reverse('project.views.detail', args=(form.id)))
Run Code Online (Sandbox Code Playgroud)

Forms.py

class ProjectAddForm(forms.ModelForm):

    class Meta:
        model = Project
Run Code Online (Sandbox Code Playgroud)

forms django reverse modelform

2
推荐指数
1
解决办法
1272
查看次数

如何在 Django ModelForm 中自动聚焦 Charfield

在我的 django 应用程序中,我想在页面加载时将焦点设置到第一个 CharField (任务)。

我的models.py

from django.db import models

class ListModel(models.Model):
    task = models.CharField(max_length=255)
    status = models.BooleanField(default=False)

    def __str__(self):
        return f"{self.task} : {str(self.status)}"
Run Code Online (Sandbox Code Playgroud)

forms.py

from django.forms import ModelForm
from .models import ListModel

class ListForm(ModelForm):
    class Meta:
        model = ListModel
        fields = ["task", "status"]
Run Code Online (Sandbox Code Playgroud)

我尝试在CharField (在 models.py 中)中添加以下小部件:

task = models.CharField(max_length=255, widget=models.TextInput(attrs={'autofocus': True})
Run Code Online (Sandbox Code Playgroud)

但它给出了一个 AttributeError:module 'django.db.models' has no attribute 'TextInput'

我还尝试将以下内容添加到ListForm 类(在 forms.py 中)

def __init__(self):
    self.fields['task'].widget.attrs.update(autofocus = 'autofocus')
Run Code Online (Sandbox Code Playgroud)

虽然我没有收到任何错误,但是当我加载页面时,焦点也没有设置到任务 CharField …

python django django-models django-forms modelform

2
推荐指数
1
解决办法
1862
查看次数